為什么要復(fù)制構(gòu)造函數(shù) 為什么定義了復(fù)制構(gòu)造函數(shù)就必須定義默認(rèn)構(gòu)造函數(shù)?
為什么定義了復(fù)制構(gòu)造函數(shù)就必須定義默認(rèn)構(gòu)造函數(shù)?此語(yǔ)句不正確。你正在仔細(xì)閱讀這本書。如果是這樣寫的,那就錯(cuò)了。我認(rèn)為是不同的對(duì)象構(gòu)造方法。默認(rèn)構(gòu)造函數(shù)是無參數(shù)構(gòu)造,復(fù)制構(gòu)造函數(shù)使用自己類型的對(duì)象如果關(guān)
為什么定義了復(fù)制構(gòu)造函數(shù)就必須定義默認(rèn)構(gòu)造函數(shù)?
此語(yǔ)句不正確。你正在仔細(xì)閱讀這本書。如果是這樣寫的,那就錯(cuò)了。
我認(rèn)為是不同的對(duì)象構(gòu)造方法。默認(rèn)構(gòu)造函數(shù)是無參數(shù)構(gòu)造,復(fù)制構(gòu)造函數(shù)使用自己類型的對(duì)象
如果關(guān)系復(fù)制構(gòu)造函數(shù)需要一個(gè)對(duì)象,則該對(duì)象可以與其他構(gòu)造函數(shù)一起構(gòu)造。當(dāng)然,它可能是默認(rèn)構(gòu)造函數(shù)或其他構(gòu)造函數(shù)
復(fù)制構(gòu)造函數(shù)是構(gòu)造函數(shù)的子集嗎?你說得對(duì)。復(fù)制構(gòu)造函數(shù)是一個(gè)構(gòu)造函數(shù)。如果您提供這個(gè),系統(tǒng)將不會(huì)提供默認(rèn)構(gòu)造函數(shù)。
我認(rèn)為這句話應(yīng)該說,如果一個(gè)類定義了一個(gè)復(fù)制構(gòu)造函數(shù),那么它應(yīng)該(應(yīng)該,不應(yīng)該)定義另一個(gè)構(gòu)造函數(shù)(不一定是默認(rèn)的)。不定義它是可以的,但是在這種情況下,類不能構(gòu)造對(duì)象,只是不能被實(shí)例化。這樣的課是沒有意義的,對(duì)吧。
為什么復(fù)制構(gòu)造函數(shù)的形參必須是一個(gè)引用?
使用引用參數(shù)復(fù)制構(gòu)造函數(shù)的一個(gè)重要原因是避免遞歸調(diào)用!從語(yǔ)言規(guī)范的角度來看,這只是一種規(guī)則。例如&B=a表示B是對(duì)a的引用。從邏輯角度看,參數(shù)的傳遞本身就是一個(gè)副本。如果不使用引用類型,則當(dāng)復(fù)制構(gòu)造函數(shù)傳遞參數(shù)時(shí)將調(diào)用復(fù)制構(gòu)造函數(shù),從而導(dǎo)致遞歸調(diào)用。因此,它是通過引用類型傳遞的。
為什么復(fù)制構(gòu)造函數(shù)的形參必須是一個(gè)引用?
復(fù)制構(gòu)造函數(shù)實(shí)際上是一個(gè)函數(shù)。如果將參數(shù)定義為類型而不是類型引用,它將首先調(diào)用該類型的復(fù)制構(gòu)造函數(shù)并重構(gòu)一個(gè)新實(shí)例,就像下面的示例類MyClass一樣。這是一個(gè)簡(jiǎn)單的類{}int fun(MyClass a)//這是一個(gè)函數(shù)。調(diào)用時(shí),編譯器會(huì)自動(dòng)調(diào)用MyClass類型的構(gòu)造函數(shù),并重新實(shí)例化MyClass int fun(MyClass&;AMPA)//此函數(shù)不會(huì)調(diào)用MyClass類型的構(gòu)造函數(shù),只需傳遞一個(gè)指針~現(xiàn)在回到您的問題,賦值構(gòu)造函數(shù)也是一種構(gòu)造函數(shù),你給它一個(gè)非引用、非指針的參數(shù),它會(huì)調(diào)用這種類型的構(gòu)造函數(shù),這很好~一個(gè)函數(shù)不斷地調(diào)用自己,這樣它就不會(huì)出錯(cuò),就不會(huì)堆棧溢出了,是嗎?簡(jiǎn)單來說,事情是這樣的:intfun(MyClass a){fun(a)}//你認(rèn)為這個(gè)函數(shù)有一天會(huì)結(jié)束嗎?
為什么復(fù)制構(gòu)造函數(shù)不添加explicit前綴?
關(guān)鍵字explicit可以阻止“單參數(shù)構(gòu)造函數(shù)”用于自動(dòng)類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換)
class test{
private:
int data
public:
test(int data=0){}
test(const test&RHS){}]}
不帶顯式,測(cè)試s=4可以編譯并通過
但是對(duì)于顯式,測(cè)試(4)不是必需的
那么復(fù)制構(gòu)造函數(shù)的定義是什么?也就是說,構(gòu)造函數(shù)的參數(shù)屬于這種類型。只要此類型的對(duì)象用于初始化同一類型的其他對(duì)象,將調(diào)用復(fù)制構(gòu)造函數(shù)。
例如:
test a=4//將不在此處調(diào)用復(fù)制構(gòu)造函數(shù)
test B=a//將在此處調(diào)用復(fù)制構(gòu)造函數(shù)
因此復(fù)制構(gòu)造函數(shù)中不存在隱式類型轉(zhuǎn)換問題,所以顯式是不需要的
構(gòu)造函數(shù)的作用是使類的成員變量有適當(dāng)?shù)某跏贾?。調(diào)用構(gòu)造函數(shù)時(shí),編譯器會(huì)在創(chuàng)建類的對(duì)象時(shí)自動(dòng)調(diào)用它。復(fù)制構(gòu)造函數(shù)意味著類的對(duì)象在創(chuàng)建時(shí)可以在現(xiàn)有對(duì)象之間初始化。當(dāng)類對(duì)象用作函數(shù)參數(shù)時(shí),或者當(dāng)類對(duì)象用作函數(shù)返回值時(shí),作為復(fù)制機(jī)制,類型值需要自動(dòng)復(fù)制。