背景:在工作学习使用C++的过程中,遇到了一些初始化方面的一些坑,查询些许资料,遂得此文
1. 构造函数初始化
在构造函数中用初始化列表初始化数据域
Class Person (parameterList): dataField1(value1), dataField2(value2)
{
// 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++初始化的方式据说十八种之多,自己写的时候找准一种就可以