通常我們都會為非抽象類定義拷貝構(gòu)造函數(shù),如果沒有定義時,我們以class的一個object作為另一個object的初值時,編譯器內(nèi)部以default memberwise initialization 方式完成,對于member class object 則不會拷貝,而是遞歸調(diào)用 memberwise initialization。
copy constructor和default constructor一樣,在必要的時候才由編譯器產(chǎn)生出來。copy constructor 以初始化的方式復(fù)制object,另一種是指定值(assignment),通過copy assignment operator
二 bitwise copy semantics
編譯器是否合成出考構(gòu)是看class是否展現(xiàn)了 bitwise copy semantics,
|
|
對于后者,編譯器就會合成出一個 copy constructor。
那么什么時候不展現(xiàn)bitwise copy semantics呢,分為四種情況
(1)class 內(nèi)含一個member object ,后者聲明有一個copy constructor,無論是程序員聲明的,還是被編譯器合成的。
(2)class 繼承自的基類有一個copy constructor,無論程序員聲明的,還是被編譯器合成的。
對于這2種情況,編譯器必須將memb或base class的copy constru調(diào)用操作安插到被合成的copy constr中。
(3)class聲明了一個或多個 virtual function時
(4)class派生的基類串中至少有一個virtual base class時。
情況3中,類中會額外增加vptr和vbtl,故就不在展現(xiàn)bitwise seamantics了,編譯器需要合成出一個copy constructor,以將vptr適當初始化。
同類型的對象vptr指向的相同的vtbl,基類和派生類的不同,看一段程序
|
|
b bb2=dob; 語句處,發(fā)生了派生類對象的切割,其vptr指向了基類的vbtl,而不是派生類。
參考文章:
轉(zhuǎn)-復(fù)制概念相關(guān),深拷貝與淺拷貝