C++新手学习的时候经常会有两个误区:

  1. 如果类没有构造函数,编译器会自动添加一个默认构造函数。
  2. 编译器合成出来的默认构造函数会初始化类数据成员。

编译器并非总是会合成默认构造函数的。根据C++文档的说明:

如果没有任何用户定义的构造函数,那么会有一个默认构造函数会被暗中声明出来。

但是合成的默认构造函数是分为trivial和nontrivial 的,trivial的其实就是没有添加,只是在概念上拥有一个tirvial构造函数。nontirivial的才是真正做实事的。当一个类没有任何构造函数时,默认构造函数会在以下4中情况下合成出来,也就是nontrivial构造函数(符合构造函数必定会被调用的C++语义)。

  1. 某个数据成员中带有默认构造函数。
  2. 继承于带有默认构造函数的基类。

以上两点容易理解,无论是成员量的还是继承的构造函数,C++保证会被调用,而这些工作只能放在类初始化的时候做,如果该类没有任何构造函数,则只能由编译器合成一个构造函数,并在其中插入调用该数据成员构造函数的代码。

  1. 带有virtual 函数的类

存在虚函数分为两种情况,一种是类申明虚函数,一个是派生链中存在虚函数。

若要理解为何会有默认构造函数合成,首先要理解虚函数的实现。

如果一个类中有虚函数,那么虚函数表会被生成出来,里面存放虚函数的地址。

在类中会安插一个指向虚表的指针,以便实现C++的动态语义,而该指针的赋值是在构造函数中完成的,所以需要一个构造函数。

  1. 虚继承

钻石继承中,会在子类中合成一个指向基类的指针(参考钻石继承的原理),这种情况下也会合成默认构造函数。

转载于:https://www.cnblogs.com/dxnbd/archive/2013/06/14/3135071.html

C++ 默认构造函数的构建相关推荐

  1. 构造函数调用默认构造函数_显式无参数构造函数与默认构造函数

    构造函数调用默认构造函数 大多数不熟悉Java的开发人员都会Swift了解到,如果他们没有指定至少一个显式构造函数,则会为Java类隐式创建一个" 默认构造函数 "( 由javac ...

  2. 显式无参数构造函数与默认构造函数

    大多数不熟悉Java的开发人员在没有指定至少一个显式构造函数的情况下 ,会很快了解到为其Java类隐式创建了" 默认构造函数 "( 由javac ). Java语言规范的 8.8. ...

  3. C++中若类中没有默认构造函数,如何使用对象数组

    前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: 1 #include <memory> 2 #include <iostrea ...

  4. C/C++编程:默认构造函数的建构操作

    C++标准提出:默认构造函数会在需要的时候被编译器生成.那什么时候被需要?被谁需要?做什么呢? class Foo{public:int val;Foo *next; };void foo_bar() ...

  5. c++ 虚函数_到底什么情况下会合成默认构造函数?

    来源:https://www.cnblogs.com/QG-whz/p/4676481.html 作者:good luck 编辑:公众号[编程珠玑] 编辑注:没有构造函数的时候编译器一定会生成默认构造 ...

  6. C++编译器会对没有构造函数的类生成默认构造函数吗?

    之前在上C++的课的时候,印象中有那么一句话: 如果一个类没有任何构造函数,那么编译器会生成一个默认的构造函数 今天在看<深度探索C++对象模型>的第二章:"构造函数语意学&qu ...

  7. C++编译器何时为用户提供默认构造函数

    第一种是类成员中有成员是类对象,并且该成员的类含有默认构造函数,那么C++编译器会帮你给这个类也生成一个默认构造函数,用来调用其成员对象的构造函数,完成该成员的初始化构造.需要强调的是,如果这个成员的 ...

  8. move std 函数 示例_确保(值类型)可拷贝类有默认构造函数

    C.43: Ensure that a copyable (value type) class has a default constructor C.43:确保(值类型)可拷贝类有默认构造函数 Re ...

  9. C++ 编译器默认构造函数奇怪问题

    非常奇怪的问题,如下 struct MyType { public:     int i;     void* operator new(size_t size,void *p,int i)     ...

  10. akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...

    Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...

最新文章

  1. linux系统命令学习系列-文件和目录管理
  2. Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符
  3. python学习笔记之集合
  4. TransactionAwareDataSourceProxy
  5. js笔记(八)ES6
  6. 学画画软件app推荐_今日推荐:拍照摄影APP之稀缺软件篇
  7. 2020年快手母婴生态报告
  8. noi 7627 鸡蛋的硬度
  9. 网络地址转换协议NAT详解
  10. 孙鑫VC学习笔记:第八讲 逃跑按钮的巧妙实现和MFC中指针的获取
  11. saltstackmysql return报错
  12. 我问自己代言,甄嬛篇
  13. 阴阳师辅助(基于按键精灵)
  14. 电子病历系统源码 winform 医院电子病历系统源码
  15. IT咨询业发展三道坎
  16. 抽象类DateFormat
  17. hdu 2897 邂逅明下
  18. 身份证扫描器web开发_如何以Web开发人员的身份建立一个令人惊叹的投资组合网站
  19. 连接ipv6服务器未响应,IPv6过渡技术未响应
  20. X86服务器虚拟化的三种技术(1)

热门文章

  1. 快速排序的python实现
  2. 【小松教你手游开发】【游戏渲染】单色shader,纹理shader
  3. Struts2中的校验器
  4. 研究云计算与大数据分析处理领域建议看的学术论文列表
  5. Silverlight 解密游戏 之十 自定义粒子特效
  6. 实训汇编语言设计——将bcd码转化为二进制数
  7. 条件随机场、CBOW、word2vect、skip-gram、负采样、分层softmax(1)
  8. 数据--第50课 - 基础查找课后练习
  9. UItabelView头部视图;
  10. 在Launcher3的小部件中隐藏Widgets或Shortcuts