1.概念
1)构造函数是用来初始化类对象的
2)所以构造函数不能用const限定符修饰,构造函数是去构造对象,肯定会改变数据成员的值,所以不能用const限定
3)构造函数的函数名与类同名,没有返回值,由函数名+初始值列表+函数体组成
2.默认构造函数
1)没有任何形参的构造函数叫做默认构造函数
3.合成的默认构造函数
2)编译器自己创建的构造函数称为合成的默认构造函数
3.1什么时候编译器会合成默认构造函数?
1)c++ primer传言“如果没有一个类没有自定义构造函数,那么编译器就会隐式定义一个合成的默认构造函数”,这句话其实不是完全对的!!!
2)当类含有类对象数据成员且该类对象数据成员有默认构造函数,则编译器会合成默认构造函数
class A {
public:
bool isTrue;
int num;
};
int main()
{
A a;
if (a.isTrue)
cout << a.num;
return 0;
}
你可能认为这里编译器肯定是合成了一个默认构造函数并调用它来初始化A的数据成员,实则不是。当类只含有内置类型或复合类型的成员时,编译器是不会为类合成默认构造函数的,即使你用“A() = default;”显式要求也没有用。
3)对于基类带有默认构造函数的派生类,编译器会合成默认构造函数:因为派生类被初始化时需要调用基类的默认构造函数完成基类部分的初始化,所以需要编译器合成一个默认构造函数,在这个构造函数中显式地去调用基类的默认构造函数
4)带有虚函数的类,编译器会合成默认构造函数:因为带有虚函数的类有一个虚函数表指针vfptr,编译器需要对vfptr初始化,而这个初始化的操作是放在默认构造函数中的
5)带有虚基类的类,编译器会合成默认构造函数:因为虚继承的子类中有一个虚基类指针vbptr,编译器需要对vbptr初始化,而这个初始化的操作是放在默认构造函数中的
6)不符合以上四种情形的而且没有声明任何构造函数的,编译器并不会合成默认的构造函数
7)编译器合成的默认构造函数的构造规则:
- 若数据成员有类内初始值,则用这个初始值来初始化
- 若没有,则执行默认初始化