第二章 構(gòu)造函數(shù)語(yǔ)意學(xué)(the semantics of constructors)
2.1 Default Construcor 的建構(gòu)操作
有四種情況,會(huì)導(dǎo)致“編譯器必須為未聲明constructor 之class 合成一個(gè) Default constructor ”. C++ Stardand 把那些合成物稱(chēng)為implicit nontrivial default constructor .被合成出來(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 constructors, 它們實(shí)際上并不會(huì)被合成出來(lái)。
在合成的default constructor 中,只有base class subobjects 和 member class objects h會(huì)被初始化。所有其它的nonstatic data member ,如整數(shù)、整數(shù)指針、整數(shù)數(shù)組等等都不會(huì)被初始化。這些初始化操作對(duì)程序而言或許有需要,但對(duì)編譯器則并非必要。如果程序需要一個(gè)“把某指針設(shè)為0”的default construct, 那么提供它的人應(yīng)該是程序員。
C++新手一般有兩個(gè)常見(jiàn)的誤解:
1. 任何class 如果沒(méi)有定義default constructor ,就會(huì)被合成出一個(gè)來(lái)。
2. 編譯器合成出來(lái)的default constructor 會(huì)明確設(shè)定“class 內(nèi)每一個(gè)data member 的默認(rèn)值”。
2.2 Copy constructor 的建構(gòu)操作
是一種特殊構(gòu)造函數(shù),具有單個(gè)形參,該形參(常用CONST修飾)是對(duì)該類(lèi)類(lèi)型的引用。當(dāng)定義一個(gè)新對(duì)象并用一個(gè)同類(lèi)型的對(duì)象對(duì)它進(jìn)行初始化時(shí),將顯式使用拷貝構(gòu)造函數(shù)。當(dāng)將該類(lèi)型的對(duì)象傳遞給函數(shù)或從函數(shù)返回該類(lèi)型的對(duì)象時(shí),將隱式使用拷貝構(gòu)造函數(shù)。
合成的拷貝構(gòu)造函數(shù):
即使我們定義了其他構(gòu)造函數(shù),也會(huì)合成拷貝構(gòu)造函數(shù)。合成拷貝構(gòu)造函數(shù)的行為是,執(zhí)行逐個(gè)成員初始化(memberwise initialize),將新對(duì)象初始化為原對(duì)象的副本。
所謂“逐個(gè)成員”,指的是編譯器將現(xiàn)有對(duì)象的每個(gè)非static 成員,依次復(fù)制到正創(chuàng)建的對(duì)象。只有一個(gè)例外,每個(gè)成員的類(lèi)型決定了復(fù)制該成員的含義。合成拷貝構(gòu)造函數(shù)直接復(fù)制內(nèi)置類(lèi)型成員的值,類(lèi)類(lèi)型成員使用該類(lèi)的拷貝構(gòu)造函數(shù)進(jìn)行復(fù)制。數(shù)組成員的復(fù)制是個(gè)例外。雖然一般不能復(fù)制數(shù)組,但如果一個(gè)類(lèi)具有數(shù)組成員,則合成拷貝構(gòu)造函數(shù)將復(fù)制數(shù)組。復(fù)制數(shù)組時(shí)合成拷貝構(gòu)造函數(shù)將復(fù)制數(shù)組的每一個(gè)元素。
注意:按位拷貝不會(huì)分配新的內(nèi)存空間而只是簡(jiǎn)單地將該地址的值復(fù)制給另一個(gè)指針,所以就會(huì)出現(xiàn)兩個(gè)指針指向同一塊內(nèi)存區(qū)域。
不要Bitwise Copy Semantics!
什么時(shí)候一個(gè)Class 不展現(xiàn)出“Bitwise Copy Semantics”呢?有四種情況:
1. 當(dāng)class 內(nèi)含一個(gè)member object 而后者的class 聲明有一個(gè)copy constructor 時(shí)
2. 當(dāng)class 繼承自一個(gè)base class 而后者存在存在有一個(gè)copy constructor 時(shí)(再次強(qiáng)調(diào),不論是被明確聲明或是被合成而得)。
3. 當(dāng)class 聲明一個(gè)或多個(gè) virtual function 時(shí)。
4. 當(dāng)class 派生自一個(gè)繼承串鏈,其中有一個(gè)或多個(gè)virtual base classes時(shí)。
posted on 2008-05-23 09:04
Macaulish 閱讀(1753)
評(píng)論(2) 編輯 收藏 引用