默认构造函数:未提供显式初始值时,用来创建对象的构造函数。
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};