学习笔记:编译器自动生成的构造函数

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值