Inside The C++ Object Model ---- The Semantics of Constructors
Posted on 2007-03-04 15:54 Teddy Yan 阅读(132) 评论(0) 编辑 收藏 举报2.1 Default Constructor 的建构操作
C++ Annotated Reference Manual (ARM)
什么时候编译器会自动创建出default constructor?
两种implicit constructor: trivial & nontrivial. nontrivial的话,编译器会自动创建
如果一个class没有任何constructor,但它内含一个member object,而后者有default constructor, 那么这个class的implicit constructor就是“nontrivial”
如果class A内含一个或一个以上的member class objects,那么class A的每一个constructor必须调用每一个member class的default constructor。编译器会扩张已经存在的
constructors,安插一些代码
"带有default constructor"的base class 是同样道理
"带有一个Virtual Function" 的 class
1.class 声明(或继承)一个virtual function
2.class 派生自一个继承串链,其中有一个或更多的virtual base classes. 不管哪种情况,由于缺乏由user声明的constructors,编译器会详细记录合成一个default
constructor 的必要信息
一个virtual function table 会被编译器产生出来,内放class的virtual functions地址
每个class object中,一个额外的pointer member会被合成出来,内含相关的class vtbl的地址
"带有一个virtual base class"的Class
到底什么是virtual base class区别是什么?如果X和Y都有相同的virtual class Z,那么Z在内存中是一份。
误解:
任何class如果没有定义default constructor,就会被合成出一个来
编译器合成出来的default constructor会明确设定“class 内每一个data member的默认值”
Copy constructor的建构操作
三种情况需要copy constructor: 付值,作为参数传递,作为返回值
Default Memberwise Initialization
如果class没有提供一个explicit copy constructor, 当class object以"相同class的另一个object"作为初值时,其内部是以所谓的default memberwise initialization手法完
成的。
一个良好的编译器可以为大部分class objects产生bitwise copies,因为它们有bitwise copy semantics
Bitwise Copy Semantics
不要展现bitwise copy semantics
1. 当class 内含一个member object 而后者的class 声明有一个copy constructor
2. 当class 继承自一个base class而后者存在一个copy constructor
3. 当class 声明了一个或者多个virtual functions
4. 当class 派生字一个继承串链,其中有一个或多个virtual base classes
为什么compiler需要添加copy constructor
重新设定virtual table的指针
//franny 的vptr 指向zooAnimal的virtual table.而非Bear的virtual table(彼由yogi的vptr指出)
ZooAnimal franny = yogi
否则程序会炸毁(blow up)
处理virtual base class subobject