C++何时会帮忙合成default constructor
来源:互联网 发布:方媛moka的淘宝店 编辑:程序博客网 时间:2024/06/16 19:07
最近在看《深度探索C++对象模型》,学到了很多东西。。。
C++新手一般有两个常见的误解:
1.任何class如果没有定义default constructor,就会被合成出一个来。
2.编译器合成出来的default constructor会显示设定“class 内每一个data member的默认值”
注意:以上两个说法都是错误的!
编译器只会在以下4种情况,并且class自身没有定义default constructor的情况下,帮忙合成default constructor.
1."带有default constructor"的member class object
也就是说,虽然class A没有显示定义default constructor,但是A class内的成员变量B,B本身是提供显示的default constructor的,这种情况下会为A构造一个default constructor.在该构造函数里会调用B的构造函数,当然只有在被调用的时候才会被合成出来。
2.“带有default constructor"的base class.
也就是说,虽然class A没有显示定义default constructor,但是A class 继承自B class,B本身是提供显示的default constructor的,这种情况下会为A构造一个default constructor.
3.“带有一个virtual function"的class.
也就是说,虽然class A没有显示定义default constructor,但是A class 内有虚函数,既然有虚函数,那么在初始化对象的时候,需要初始化其中的指针vptr指向vtable,所以这种情况下会为A构造一个default constructor.
4.“带有一个virtual base class" 的class
即下面这种情况:
class X{public:int i;};class A:public virtual X{public:int j;};class B:public virtual X{public:int d;};class C:public A,public B{public:int k;}
这种情况下,编译器会为A,B,C合成default constructor,理由是derived class中都有指针指向virtual base class,需要初始化该指针。
同时需要注意,只有再必要的时候编译器才会合成出来,如程序中逗没建该class的对象,故编译器肯定也不用合成出来。
另外,编译器合成出来的,只是为了满足编译要求,只对那些必要的值进行初始化,不会初始化所有值,初始化所有值这是满足程序员要求了。。。编译器没那么勤奋,而且也不知道其他值该初始化成什么值。。。
- C++何时会帮忙合成default constructor
- C++何时会帮忙合成default constructor
- 编译器什么时候会合成default constructor
- 《深入理解C++对象模型》何时合成Default Constructor
- 深度探索C++对象模型-----编译器’何时‘自动合成nontrivial default constructor
- 编译器合成的default constructor
- [C++]default constructor默认构造函数
- default constructor
- default constructor
- Default Constructor
- Default Constructor && Copy Constructor
- 编译器会自动生成default constructor,这是真的吗?
- C++中编译器必须为未申明constructor的class合成一个default constructor的几种情况
- c++中编译器必须为未申明constructor的classes合成一个default constructor的4种情况详解
- Implicit super constructor Object() is undefined for default constructor. Must define an explicit c
- C++ default constructor 讨论
- Default Constructor 建构操作
- c++的“default constructor”
- 解决thinkpad t440p ubuntu 14.04无线不能用问题
- 2014-6-4任务完成情况
- 程序员生存定律--程序人生的出口
- 备忘网址
- iOS腾讯云MTA嵌入方法使用小结
- C++何时会帮忙合成default constructor
- 求最大公约数的几种算法分析
- IPv6 链路本地地址和本地唯一地址什么区别
- centos 5 yum安装与配置vsFTPd FTP服务器详细步骤
- TOJ 4074 Running Laps -- 树状数组
- Usid与Guid的一些理解
- Windows 7 X64 中 PL/SQL Developer 连接 Oracle 11g Database
- 排序算法收集整理
- 每日算法之二十九:Search in Rotated Sorted Array