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,如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式。
- class animal
- {
- public:
- animal(int height, int weight)
- {
- cout<<"animal construct"<<endl;
- }
- …
- };
- class fish:public animal
- {
- public:
- fish():animal(400,300)
- {
- cout<<"fish construct"<<endl;
- }
- …
- };
class CurveFittingEdge: public g2o::BaseUnaryEdge<1,double,CurveFittingVertex>//類模板<模板引數列表:觀測值維度,型別,連線頂點型別>{public:EIGEN_MAKE_ALIGNED_OPERATOR_NEWCurveFittingEdge( double x ): BaseUnaryEdge(), _x(x) {}//子類顯試呼叫父類建構函式
// 計算曲線模型誤差double _x; // x 值, y 值為 _measurement};