轉載請註明出處, 作者連絡方式: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