c++的编译器在某些特定的情况下,会给类自动生成无参的构造函数,比如
1. 成员变量再声明的同时进行了初始化
2. 有定义虚函数
3. 虚继承了其他类
4. 包含对象类型的成员,且这个成员有构造函数(编译器生成或自定义)
5. 父类有构造函数
总结: 对象创建后,需要做一些额外操作时(比如内存操作,函数调用),编译器一般都会为其生成构造函数。
demo:
不会自动生成构造函数
1. 无成员变量时,无需进行变量的初始化,在编译时没有必要生成构造函数。
class Person {
};
2. 根据创建对象的方式不同,可能自动生成构造函数
1) 通过Persion persion创建对象时,成员变量未初始化时,无需进行变量的初始化,在编译时没有必要生成构造函数。m_price默认值为0xcc。
2) 通过new Persion()创建对象时,成员变量初始化为0,在编译时生成构造函数。m_price默认值为0。
class Person {
public:
int m_price;
};
编译时自动创建构造函数
1. 定义虚函数,在创建对象时,需要在表的开始位置多出4个字节存储虚表地址,也就是在虚表的前4个字节赋值,与给成员变量赋值类似,即编译时需要自动生成构造函数。
class Person {
public:
int m_price;
virtual voi run(){}
};
2.虚继承:在创建新的对象时,会在最前面的4个字节进行初始化存储虚表地址。可参考菱形虚继承讲解
class Student :virtual public Person{
};
3. 包含对象类型的成员,且这个成员有构造函数(编译器生成或自定义)
class Car {
public:
int m_price;
Car() {} // 内部有构造函数
};
class Person {
public:
Car car; // person 对象创建时,就会调用Car的构造函数
};
int main(){
Person person;
return 0;
}
4. 父类有构造函数:父类有构造函数的时候,子类优先调用父类的构造函数。
class Person{
public:
Person() {}
}
class Student : public Person {
}