深度探索C++对象模型:默认构造函数

默认构造函数在被需要的时候被编译器产生出来。

这句话的关键部分是:

  1. 被谁需要?
  2. 什么时候被需要?
  3. 做什么事情?

被谁需要?

编译器为程序构建默认构造函数是因为编译器需要它,而不是因为程序需要它。程序需要什么应该是程序员的责任,应该由程序员提供。举个例子,例如下面这段代码:

class  Foo  {
 public:
 int val;
 Foo* pnext; 
}  

 void  foo_bar()  {
    Foo bar; 
   // 程序需要 bar's members 都被初始化为 0 
  if (bar.val || bar.pnext) {
     // do something
 } 
} 

该段程序的正确语意是希望 Foo 的默认构造函数将 val 和 pnext 初始化为 0,但此处编译器并不会为 Foo 生成默认构造函数,因为这里不满足“需要的时候“这个条件,程序需要不代表编译器需要。后面我们会了解到就算此处编译器为 Foo 生成了默认构造函数,该默认构造函数也不会对 val 和 pnext 进行初始化,具体原因请看“做什么事情?”部分。

什么时候需要?

上面解释了默认构造函数是被编译器需要的,那么编译器什么时候需要它呢?在下列四种情况下编译器会生成默认构造函数:

  1. class 内包含有 default constructor 的 member object ,合成 default constructor 为了调用 member object 的 default constructor 。
  2. class 继承自含有 default constructor 的基类,合成 default constructor 为了调用基类的 default constructor 。
  3. 带有虚函数的 class ,合成 default constructor 主要为了初始化vptr(虚函数表指针)。
  4. class 有一个及以上的虚基类,合成 default constructor 主要为了初始化虚基类指针。

当满足上面的条件时,编译器会对 constructor 进行扩展,扩展的规则如下:

  1. 当 class 没有定义 constructor ,编译器会合成 default constructor ,并加入编译器需要的操作,可能包括调用 member object 的 default constructor ,调用基类的 default constructor ,初始化虚函数表指针及虚基类指针。
  2. 当 class 已经定义了一个或多个 constructor 时,编译器不会再去合成 constructor ,但会扩展所有 constructor 加入编译器需要的操作。

做什么事情?

从上面的分析中可以看出,默认构造函数所做的事情用一句话可以概括:只执行编译器所需要的行为。所以说即使编译器为 Foo 生成了默认构造函数,该默认构造函数也不会对 val 和 pnext 进行初始化,因为编译器并不需要该行为,这是程序员应该做的事情。

总结:

编译器只合成他需要的 default constructor 并且只做他需要的操作。C++ 新手常见的两个 误解 :

  1. 任何 class 如果没有定义 default constructor ,就会被合成出一个来。
  2. 编译器合成出来的 default constructor 会明确设定 class 内每一个 data member 的默认值。

其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值