C++ 默认构造函数的构建
C++新手学习的时候经常会有两个误区:
- 如果类没有构造函数,编译器会自动添加一个默认构造函数。
- 编译器合成出来的默认构造函数会初始化类数据成员。
编译器并非总是会合成默认构造函数的。根据C++文档的说明:
如果没有任何用户定义的构造函数,那么会有一个默认构造函数会被暗中声明出来。
但是合成的默认构造函数是分为trivial和nontrivial 的,trivial的其实就是没有添加,只是在概念上拥有一个tirvial构造函数。nontirivial的才是真正做实事的。当一个类没有任何构造函数时,默认构造函数会在以下4中情况下合成出来,也就是nontrivial构造函数(符合构造函数必定会被调用的C++语义)。
- 某个数据成员中带有默认构造函数。
- 继承于带有默认构造函数的基类。
以上两点容易理解,无论是成员量的还是继承的构造函数,C++保证会被调用,而这些工作只能放在类初始化的时候做,如果该类没有任何构造函数,则只能由编译器合成一个构造函数,并在其中插入调用该数据成员构造函数的代码。
- 带有virtual 函数的类
存在虚函数分为两种情况,一种是类申明虚函数,一个是派生链中存在虚函数。
若要理解为何会有默认构造函数合成,首先要理解虚函数的实现。
如果一个类中有虚函数,那么虚函数表会被生成出来,里面存放虚函数的地址。
在类中会安插一个指向虚表的指针,以便实现C++的动态语义,而该指针的赋值是在构造函数中完成的,所以需要一个构造函数。
- 虚继承
钻石继承中,会在子类中合成一个指向基类的指针(参考钻石继承的原理),这种情况下也会合成默认构造函数。
转载于:https://www.cnblogs.com/dxnbd/archive/2013/06/14/3135071.html
C++ 默认构造函数的构建相关推荐
- 构造函数调用默认构造函数_显式无参数构造函数与默认构造函数
构造函数调用默认构造函数 大多数不熟悉Java的开发人员都会Swift了解到,如果他们没有指定至少一个显式构造函数,则会为Java类隐式创建一个" 默认构造函数 "( 由javac ...
- 显式无参数构造函数与默认构造函数
大多数不熟悉Java的开发人员在没有指定至少一个显式构造函数的情况下 ,会很快了解到为其Java类隐式创建了" 默认构造函数 "( 由javac ). Java语言规范的 8.8. ...
- C++中若类中没有默认构造函数,如何使用对象数组
前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: 1 #include <memory> 2 #include <iostrea ...
- C/C++编程:默认构造函数的建构操作
C++标准提出:默认构造函数会在需要的时候被编译器生成.那什么时候被需要?被谁需要?做什么呢? class Foo{public:int val;Foo *next; };void foo_bar() ...
- c++ 虚函数_到底什么情况下会合成默认构造函数?
来源:https://www.cnblogs.com/QG-whz/p/4676481.html 作者:good luck 编辑:公众号[编程珠玑] 编辑注:没有构造函数的时候编译器一定会生成默认构造 ...
- C++编译器会对没有构造函数的类生成默认构造函数吗?
之前在上C++的课的时候,印象中有那么一句话: 如果一个类没有任何构造函数,那么编译器会生成一个默认的构造函数 今天在看<深度探索C++对象模型>的第二章:"构造函数语意学&qu ...
- C++编译器何时为用户提供默认构造函数
第一种是类成员中有成员是类对象,并且该成员的类含有默认构造函数,那么C++编译器会帮你给这个类也生成一个默认构造函数,用来调用其成员对象的构造函数,完成该成员的初始化构造.需要强调的是,如果这个成员的 ...
- move std 函数 示例_确保(值类型)可拷贝类有默认构造函数
C.43: Ensure that a copyable (value type) class has a default constructor C.43:确保(值类型)可拷贝类有默认构造函数 Re ...
- C++ 编译器默认构造函数奇怪问题
非常奇怪的问题,如下 struct MyType { public: int i; void* operator new(size_t size,void *p,int i) ...
- akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...
Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...
最新文章
- linux系统命令学习系列-文件和目录管理
- Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符
- python学习笔记之集合
- TransactionAwareDataSourceProxy
- js笔记(八)ES6
- 学画画软件app推荐_今日推荐:拍照摄影APP之稀缺软件篇
- 2020年快手母婴生态报告
- noi 7627 鸡蛋的硬度
- 网络地址转换协议NAT详解
- 孙鑫VC学习笔记:第八讲 逃跑按钮的巧妙实现和MFC中指针的获取
- saltstackmysql return报错
- 我问自己代言,甄嬛篇
- 阴阳师辅助(基于按键精灵)
- 电子病历系统源码 winform 医院电子病历系统源码
- IT咨询业发展三道坎
- 抽象类DateFormat
- hdu 2897 邂逅明下
- 身份证扫描器web开发_如何以Web开发人员的身份建立一个令人惊叹的投资组合网站
- 连接ipv6服务器未响应,IPv6过渡技术未响应
- X86服务器虚拟化的三种技术(1)