Default Constructor

本文详细解释了C++中默认构造函数的生成条件及其行为,包括四种特定情况下编译器如何生成非平凡默认构造函数,并探讨了程序员在使用这些构造函数时需要注意的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,何时生成一个default constructor?

当编译器需要时就会生成一个default constructor,这个default constructor只执行编译器所需的行为。例如:下面是一个Student类,编译器生成的default constructor不会将两个data成员grade与age初始化为0。

class Student{
private:
    float grade;
    int age;
};


二,在编译器需要时会生成默认的default constructor,什么时间是编译器需要呢?

下面这四种情况可以理解为编译器需要,在下面四种情况下生成的default constructor是nontrivial default constructor(有用的)。

1,类中包含member object

下面的Student类,有一个Address类型的数据成员addr

class Student{
private:
    Address addr;
    float grade;
    int age;
};

编译器会给这个class合成一个default constructor,不过这个合成操作只有在constructor真正需要被调用时才发生。合成的default constructor内含必要的代码,能够调用Address的default constructor来处理Student::addr,但是它不产生任何代码来初始化Student::gradeStudent::age。将Student::addr初始化是编译器的责任,但是将Student::grade与Student::age初始化是程序员的责任。


2,带有default constructor的Base class

如果一个Derived class派生自一个带有default constructor的Base class,那么这个Derived class的default constructor就会被合成,它将调用上一层Base class的default constructor


3,带有一个virtual function的class

下面两个行为会在编译期间发生

(1),编译器会为这个class创建一个virtual function table,在这个table中存放每一个virtual function的地址。

(2),在每一个class object中,一个额外的pointer member(也就是vptr)会被编译器合成,内含相关的class table的地址。编译器合成的default constructor,必须为每一个class object的vptr设定初值,放置适当的virtual table的地址。


4,带有一个virtual Base Class的class

虚继承比较复杂,在这里不做过多的介绍。


三,对default constructor的理解

1,如果对应的上面的四种情况,生成的default constructor是nontrivial default constructor(有用的);否则,生成的default constructor是trivial default constructor(没有用的)

2,编译器合成的default constructor并不会显示设定class内每一个data member的默认值。例如:class中包含一个data成员age(int  class::age),编译器合成的default constructor不会设定它的默认值


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值