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