1. 程式人生 > >C++中的預設建構函式和初始化列表和子類呼叫父類建構函式

C++中的預設建構函式和初始化列表和子類呼叫父類建構函式

預設建構函式:未提供顯式初始值時,用來建立物件的建構函式。

class testClass
{

public:

    testClass();                                 /* 預設建構函式 */
    testClass(int a, char b);              /* 建構函式 */
    testClass(int a=10,char b='c');    /* 預設建構函式 */

private:
    int  m_a;
    char m_b;
};

1,定義預設建構函式有兩種方式,如上述程式碼展示的,一是定義一個無參的建構函式,二是定義所有引數都有預設值的建構函式 ;

2,注意:一個類只能有一個預設建構函式!也就是說上述兩種方式不能同時出現,一般選擇 testClass(); 這種形式的預設建構函式 ;

建構函式初始化列表:

格式:建構函式(資料型別  數值1,資料型別  數值2):變數名1(數值1),變數名2(數值2){} 

子類呼叫父類建構函式初始化列表:

子類建構函式(資料型別  數值1,資料型別  數值2):父類建構函式(),變數名1(數值1),變數名2(數值2){} 

1)在建構函式執行時,先執行初始化列表,實現變數的初始化,然後再執行函式內部的語句

2)成員初始化的順序只與宣告的順序有關,而跟初始化列表的順序無關

3)  當類成員中有引用和const常量時就一定得初始化,否則會報錯,

 

也可在宣告的時候對他進行初始化

    const int a=1;

初始化列表是先於建構函式的函式體執行,並且成員的初始化列表與成員的宣告順序相同的 

 

子類呼叫父類建構函式:

子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。

1. 如果子類沒有定義建構函式,則呼叫父類的預設構造方法。

2,在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設建構函式

3,在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式 且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的構造方法,則子類必須顯示呼叫此帶參構造方法)。

4,如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式。

  1.  class animal  
  2.  {  
  3.  public:  
  4.    animal(int height, int weight)  
  5.    {  
  6.      cout<<"animal construct"<<endl;  
  7.    }  
  8.    …  
  9.  };  
  10.  class fish:public animal  
  11.  {  
  12.  public:  
  13.    fish():animal(400,300)  
  14.    {  
  15.      cout<<"fish construct"<<endl;  
  16.    }  
  17.    …  
  18.  }; 
class CurveFittingEdge: public g2o::BaseUnaryEdge<1,double,CurveFittingVertex>//類模板<模板引數列表:觀測值維度,型別,連線頂點型別>
{
public:
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    CurveFittingEdge( double x ): BaseUnaryEdge(), _x(x) {}//子類顯試呼叫父類建構函式
    // 計算曲線模型誤差 
    double _x;  // x 值, y 值為 _measurement
};