四种情况,编译器必须为未声明构造函数之class合成一个默认构造函数
2009-04-09 20:20
337 查看
四种情况,C++编译器必须为未声明构造函数之class合成一个默认构造函数
第一种情况,class 有member object(该member object有default constructor), class需要default constructor调用member object default constructor
第二种情况,如果一个没有任何constructor的class 派生自一个"带有default constructor"的base class.那么它的default constructor会被合成出来。
第三种情况,如果一个class申明了virtual function,,如果该类没有任何constructor,
编译器也会为它加default constructor.
(如果用户有constructor,编译器会在他的constructor中添加一些code,用来初始化vptr)
第四种情况,一个class(没有申明任何constructor)派生自一个继承串链,其中有一个或多个virtual base classes,编译器也会合成出一个default constructor,在其中放入每一个virtual base class的执行期存取操作的的码,
(如果用户申明了constructors,编译器会在constructor中安插virtual base class执行期存取操作的的码)
上面四种情况合成出的default constructor都是nontrivial default constructors,
不在此情况之内的都trivial default constructors,它们实际上并不会被编译器合成出来
在合成的default constructors,只有base class subobjects和member class object会
被初始化,所有其它的nonstatic data member,如整数、整数指针、整数数组等等都不会被编译器初始化。
第一种情况,class 有member object(该member object有default constructor), class需要default constructor调用member object default constructor
第二种情况,如果一个没有任何constructor的class 派生自一个"带有default constructor"的base class.那么它的default constructor会被合成出来。
第三种情况,如果一个class申明了virtual function,,如果该类没有任何constructor,
编译器也会为它加default constructor.
(如果用户有constructor,编译器会在他的constructor中添加一些code,用来初始化vptr)
第四种情况,一个class(没有申明任何constructor)派生自一个继承串链,其中有一个或多个virtual base classes,编译器也会合成出一个default constructor,在其中放入每一个virtual base class的执行期存取操作的的码,
(如果用户申明了constructors,编译器会在constructor中安插virtual base class执行期存取操作的的码)
上面四种情况合成出的default constructor都是nontrivial default constructors,
不在此情况之内的都trivial default constructors,它们实际上并不会被编译器合成出来
在合成的default constructors,只有base class subobjects和member class object会
被初始化,所有其它的nonstatic data member,如整数、整数指针、整数数组等等都不会被编译器初始化。
相关文章推荐
- C++中编译器必须为未申明constructor的class合成一个default constructor的几种情况
- c++ 编译器为class自动合成默认构造函数的四种情况
- c++中编译器必须为未申明constructor的classes合成一个default constructor的4种情况详解
- C++构造函数语意学--编译器在哪些情况合成default constructot
- 关于默认构造函数的几个错误认识(四种情况下,编译器会生成默认构造函数)
- C++ 编译器生成默认构造函数的四种情况
- C++ 编译器生成默认构造函数的四种情况
- C++ 编译器生成默认构造函数的四种情况
- 编译器提供构造函数的情况
- python中必须使用global声明全局变量的情况
- 第二章 构造函数语意学 编译器何时生成默认构造函数?
- C++中如果声明一个对象指针时,会不会调用构造函数?
- c++构造函数必须用到初始化成员列表的四种情况
- 关于QSocket的释放的一个需要注意的情况(必须先断开连接)
- clang编译器, __declspec(novtable)修饰的class 如果虚函数不声明为纯虚则链接失败.
- 求一个C++或Java或者C#写的支持C89的编译器前端,如何解析C语言的声明?
- 合成的默认构造函数定义为delete的一种情况(针对C++11标准)
- 什么时候编译器会合成派生类的构造函数
- 我也写了一个牛顿迭代法,貌似不需要特殊处理溢出的情况 class Solution { public...
- 构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数