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
};

猜你喜欢

转载自blog.csdn.net/hanshihao1336295654/article/details/85085274