默认构造函数

关于默认构造函数两个常见的误解:

1.任何一个class,如果没有定义默认构造函数(default constructor) ,编译器都会为其合成一个默认构造函数

2.编译器合成的默认构造函数,会设定会明确设定数据成员的默认值


编译器不是总会为class合成默认构造函数,只是在编译器需要时才合成,注意:是编译器需要,而不是程序需要。

那在什么情况下,编译器会合成默认构造函数呢?

在没有显示声明任何构造函数时,下面4种情况编译器会合成默认构造函数

1.类的对象成员带有默认构造函数

           因为需要在类的构造函数中调用对象成员的默认构造函数,所以这时编译器会合成默认构造函数,

如果有多个对象成员,会按照声明顺序依次调用其默认构造函数,而且他们的调用是在程序显示的初始化基本数据成员(如int)之前。

2.基类带有默认构造函数

           因为需要在子类的构造函数中调用基类的默认构造函数,所以此时编译会合成一个构造函数

3.带有虚函数的类,声明或继承了一个虚函数

           带有虚函数的类对象,编译器都会为其安插一个vptr的指针,指向vtbl,以实现多态机制,

在构造这样的对象时,vptr需要设置初始值(即:虚函数表),

所以此时,如果没有显示定义任何构造函数,编译器会为其合成一个默认构造函数。

4.在继承链中有一个或多个虚基类

           构造对象时,编译器会为对象安插一个指向虚基类的指针,所以需要合成一个默认构造函数,并初始化这个虚基类指针。


          其他情形,编译器不会合成默认构造函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值