Inside The C++ Object Model 閱讀筆記
1. The semantics of constructor有4種情況會導(dǎo)致“編譯器必須為未聲明constructor之classes合成一個default constructor“。C++ 標(biāo)準(zhǔn)把那些合成物稱為implicit nontrivial default constructors。被合成出來的constructor只能滿足編譯器(而非程序)的需要。它之所以能夠完成任務(wù),是借著“調(diào)用member object 或 base class 的default constructor“ 或是 ”為每一個object初始化其virtual function 機制或virtual base class機制“而完成。至于沒有存在那四種情況而又沒有聲明任何constructor的classes,我們說它們擁有的是implicit trivial default constructors,它們實際上并不會被合成出來。
在合成出來的default constructor中,只有base class subobjects 和member class objects會被初始化。所有其它的nonstatic data memeber,如整數(shù)、整數(shù)指針、整數(shù)數(shù)組等等都不會被初始化。這些初始化操作對程序而言或許有需要,但對編譯器則并非必要。
2. The semantics of copy constructor
有4種情況,一個class不展現(xiàn)出"bitwise copy semantics":
1) 當(dāng)class內(nèi)含一個member object而后者的class聲明有一個copy constructor時(不論是被class 設(shè)計者明確的聲明,還是被編譯器合成);
2) 當(dāng)class繼承自一個base class而后者存在一個copy constructor時(再次強調(diào),不論是被明確聲明還是被合成而得);
3) 當(dāng)class聲明了一個或多個virtual functions時;
4) 當(dāng)class派生自一個繼承串鏈,其中有一個或多個virtual base classes時。
前2種情況中,編譯器必須將member或base class的"copy constructors 調(diào)用操作"安插到被合成的copy constructor中。