标签:
一、对于class X,有四种情况,会造成“编译器必须为未声明constructor的classes合成一个default constructor或者扩充user-constructor”,对于其它情况,编译器什么也不做,如果程序需要,那是程序员的责任。
1、带有Default Constructor的Member Class Object:“如果class A内含一个或一个以上的member class objects,那么编译器会为没有构造函数的类添加构造函数来调用每一个member class objects。如果有default constructors,编译器会扩张已存在的constructors,在其中安插一些代码,使得user code被执行之前,先调用必要的default constructor。
2、带有Default Constructor的Base class:编译器会生成默认构造函数或者扩充已有构造函数,会在Default Constructors的member class objects调用之前调用。
3、带有一个Virtual Function的class:一个vtbl和vptr会被自动生成出来,用来执行多态。
4、带有一个Virtual base class 的class:因为virtual base class 在每个派生对象中位置不固定,所以加了一层间接性,用以在执行期动态确定virtual base class的变量位置。提供间接性的指针就是Default constrrctor生成的。
二、当某个constructor真正需要调用时会合成default constructor,如何避免在每个模块中都合成一个呢?
解决方法是把合成的default constructor、copy constructor、destructor、assignment copy operator都以inline方式完成。一个inline函数有静态链接,不会被文件以外者看到。如果函数太过复杂,不适合做inline,就会合成出一个explicit non-inline static实例。
深入探索C++对象模型->2.1 Default Constructor的构造操作
标签:
原文地址:http://www.cnblogs.com/linux-hp/p/5792336.html