深度探索C++对象模型之构造、解构、拷贝语意学小结

1、 一般而言,class的data members应该被初始化,并且只在constructor中或者是在class的member functions中指定初值。其他任何操作都将破坏封装性,使class的维护和修改更加困难。

2、 可以定义并调用invoke一个pure virtual function,但它只能被静态调用,不能经由虚拟机制调用。每一个derived class destructor会被编译器加以扩展,静态调用每一个virtual base class以及上一层base class的destructor。因此,不管base class的virtual destructor是否声明为pure,它必须被定义。最好的方案是不要把virtual destructor声明为pure。

3、 无继承情况下的对象构造,C++ Standard要求编译器尽量延迟nontrivial members的实际合成操作,直到真正遇到其使用场所为止。

一般而言,继承体系下编译器对constructor所作的扩充操作以及次序大约如下:

(1) 所有virtual base class constructors必须从左到右、从深到浅被调用:如果class被列于member initialization list中,那么任何明确指定的参数都必须传递过去,否则如果class有一个default constructor,也应该调用它; class中的每一个virtual base class subobject的偏移量offset必须在执行期可被存取;如果class object是最底层most-derived的class,其constructors可能被调用,某些用以支持这个行为的机制必须被方进来。

(2) 以base class的声明次序调用上一层base class constructors:如果base class被列于member initialization list中,那么任何明确指定的参数都必须传递过去,否则若它有default constructor或default memberwise copy constructor,那么就调用它;如果base class是多重继承下的第二或后继的base class,那么this指针必须有所调整。

(3)  如果class object有virtual table pointer(s),它(们)必须被设定初值,指向适当的virtual table(s)。

4、对象复制语意学。只有在默认行为所导致的语意不安全或者不正确以致发生别名化aliasing或者内存泄漏memory leak时,才需要设计一个copy assignment operator。否则,程序反倒会执行得较慢。如果仅仅是为了把NRV优化开关打开而提供一个copy constructor,那么就没有必要一定要提供一个copy assignment operator。copy assignment operator有一个非正交情况,那就是它缺乏一个平行于member initialization list的member assignment list。

事实上,copy assignment operator在虚拟继承情况下行为不佳,需要小心设计和说明。许多编译器甚至并不尝试取得正确的语意,它们在每一个中间的copy  assignment operator中调用每一个base class instance,于是造成virtual base copy assignment operator的多个实体被调用。建议尽可能不要允许一个virtual base class的拷贝操作,并不要在任何virtual base class中声明data member。

5、 解构语意学。如果class没有定义destructor,那么只有在其内带的member object或base class拥有destructor时,编译器才会自动合成出一个destructor。

一个由程序员定义的destructor被扩展的方式类似constructors被扩展的方式,只是顺序相反:

 (1)destructor的函数本体首先被执行;

 (2)如果class拥有member class objects,而后者拥有destructors,那么它们将以声明的相反顺序而调用;

 (3)如果object内带一个vptr,则现在被重新设定以指向适当base class之virtual table;

 (4)如果有任何直接的nonvirtual base classes拥有destructor,它们将以声明的相反顺序而调用。

 (5)如果有任何virtual base classes拥有destructor,而前面讨论的这个class是most-derived class,那么它们会以原先构造顺序的相反顺序被调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值