bitwise and memberwise

转载请注明出处, 作者联系方式:hongszh at gmail.com


在看《深度探索C++对象模型》的时候,碰到了Memberwise和bitwise的说法,仔细推敲了一下memberwise就是C++中成员初始化的一个泛称,而bitwise是初始化过程中的一个特殊情况,这里按我的理解对memberwise和bitwise做一个文字总结,不对的地方欢迎对该话题感兴趣的朋友提出好的见解。

Memberwise Initialization

P49,Default Memberwise Initialization一节:如果一个class没有提供一个explicit copy construct,当该class object以相同class的另一个object作为初值时,其内部就是以所谓的memberwise initialization手法完成的。也就是把每一个内建的或派生的data member(比如一个指针或一数组)的值,从某一个object拷贝一份到另一个object身上,不过它并不会拷贝其中的member class object(这里所说的这种情况应该是member class也不包含copy constructor,不论是被class设计者明确声明,或者是被编译器合成),而是以递归的方式施行memberwise initialization。

所以这里的memberwise initialization 就是bitwise copy。

那么如果一个class没有提供一个explicit copy construct,当该class object以相同class的另一个object作为初值时,别且有一个member class object,这个member class 有一个copy constructor(不论是被class设计者明确声明,或者是被编译器合成,总之它是nontrivial),这种情况下该class就不会展现出“bitwise copy semantics”,就是说不会以递归的方式对member class object施行memberwise initialization,而是通过调用member class的copy constructor完成memberwise initialization。

Bitwise copy

综上所述,bitwise copy前提条件是class没有提供一个explicit copy construct,可以分两个方面去理解:一个是含有member class oject的情况,一个是继承自一个base class的情况;当然对于class中含有virtual functions或者含有virtual base classes的情况就不用讨论了,肯定不会出现bitwise copy。

1. 如果一个class没有提供一个explicit copy construct,当该class object以相同class的另一个object作为初值时,如果它有一个member class object,初始化member class object的时候是以递归的方式进行memberwise initialization,不会调用copy constructor进行初始化。

2. 如果一个class没有提供一个explicit copy construct,当该class object以相同class的另一个object作为初值时,如果它继承自一个base class,该base class不存在一个copy constructor(没有被class设计者明确的声明,也不会被编译器合成),初始化base class的部分类似初始化member class object,直接copy base class相关member给要被初始化的base class的相关member。

Memberwise Assignment & Memberwise Initialization

一个class object可以从两种方式获得,一种是被初始化(initialization),一种是赋值(assignment),排除bitwise copy的情况,它们之间的主要区别是memberwise assignment调用每一个成员assignment operator(operator=),而memberwise initialization调用每一个成员的copy constructor。

see:  http://hi.baidu.com/hongszh/blog/item/c312c4ca63c2584ef21fe797.html

posted on 2011-04-07 10:16  ATAK  阅读(881)  评论(0编辑  收藏  举报

导航