构造函数初始化列表、默认构造函数以及带有内嵌对象的构造函数相关知识

背景:在工作学习使用C++的过程中,遇到了一些初始化方面的一些坑,查询些许资料,遂得此文

1. 构造函数初始化

在构造函数中用初始化列表初始化数据域

Class Person (parameterList): dataField1value1), dataField2value2

{

  // Something to do

}

2. 为何需要构造函数初始化列表

背景:类的数据域是一个对象类型,被称为对象中的对象或者内嵌对象,而内嵌对象必须在被嵌对象的构造函数体执行前就构造完成,所以就只能在函数体前面位置处添加冒号等规范,来实现构造函数初始化

class Time { .... }

class Action 
{
private:

    int index;
    Time time;

public:
    //time对象应该在构造函数体之前构造完成
    Action(int index, int hour, int minute, int second):index(index),time(hour, minute, second) {}
};

3. 默认构造函数

默认构造函数是可以无参调用的构造函数,既可以是定义为空参数列表的构造函数,也可以是所有参数都有默认参数值的构造函数

class Circle1 
{
public:
    Circle1() // 无参数
    {      
        radius = 1.0; /*函数体可为空*/
    }
private:
  double radius;
};


class Circle2 
{
public:
    Circle2(double r = 1.0): radius(r) {} // 所有参数都有默认值
private:
    double radius;
};

注意bug点:如果一个类有非默认的构造函数,此时编译器就不会再为该类生成默认的构造函数(而默认的构造函数有时候还必须都有)

3.1.若对象类型成员/内嵌对象成员没有被显式初始化

构造函数显式的初始化,是指在类声明中提供构造函数原型,并提供是实现代码;而隐式的初始化,是指在你未提供构造函函数时,C++会自动提供一个构造函数,并初始化

(1) 该内嵌对象的无参构造函数会被自动调用

(2)  若此时内嵌对象没有无参构造函数,则编译器报错

class Cirle
{
.......
}
class X
{
private:
    Circle c1;
public:
    X(){}
}
//此时c1中无默认构造函数就会出错(被顶了)

3.2. 你也可以在初始化列表中手工构造对象

 

class Cirle
{
.......
};
class X
{
private:
    Circle c1;
public:
    X():c1(...){}
};

3.3. 若类的数据域是一个对象类型(且它没有无参构造函数),则该对象初始化可以放到构造函数初始化列表中

这里我想说的就是这种上面那种情况,不过为什么说可以而不是必须,是因为在C++11中有就地初始化(貌似是)

总结:

C++初始化的方式据说十八种之多,自己写的时候找准一种就可以

猜你喜欢

转载自blog.csdn.net/shanshenyuyou/article/details/94571603