什么情況下調(diào)用拷貝構(gòu)造函數(shù) 下列情況中,不會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)的是()?
下列情況中,不會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)的是()?編譯器優(yōu)化。例如,編譯器知道返回了臨時(shí)對(duì)象,而編輯器直接將其放入要返回的堆棧中。程序直接從堆棧返回結(jié)果,其中保存了一個(gè)復(fù)制構(gòu)造這是C常用的優(yōu)化方法關(guān)鍵字exp
下列情況中,不會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)的是()?
編譯器優(yōu)化。例如,編譯器知道返回了臨時(shí)對(duì)象,而編輯器直接將其放入要返回的堆棧中。程序直接從堆棧返回結(jié)果,其中保存了一個(gè)復(fù)制構(gòu)造
這是C常用的優(yōu)化方法
關(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){}]}
如果沒(méi)有顯式,測(cè)試s=4可以編譯并通過(guò)
但是有顯式,測(cè)試(4)不是必需的
那么復(fù)制構(gòu)造函數(shù)的定義是什么?也就是說(shuō),構(gòu)造函數(shù)的參數(shù)屬于這種類型。只要此類型的對(duì)象用于初始化同一類型的其他對(duì)象,將調(diào)用復(fù)制構(gòu)造函數(shù)。
例如:
test a=4//此處不會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)
test B=a//此處將調(diào)用復(fù)制構(gòu)造函數(shù)
因此復(fù)制構(gòu)造函數(shù)中沒(méi)有隱式類型轉(zhuǎn)換問(wèn)題,因此不需要顯式
復(fù)制構(gòu)造函數(shù)的一個(gè)重要原因帶參考參數(shù)是為了避免遞歸調(diào)用!從語(yǔ)言規(guī)范的角度來(lái)看,這只是一種規(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)用。因此,它是通過(guò)引用類型傳遞的。
為什么復(fù)制構(gòu)造函數(shù)不添加explicit前綴?
方法仍有問(wèn)題。構(gòu)造函數(shù)包括復(fù)制構(gòu)造函數(shù)。在創(chuàng)建對(duì)象時(shí)調(diào)用構(gòu)造函數(shù)。關(guān)鍵詞:創(chuàng)建時(shí),a是形式。指針類型僅在新建時(shí)調(diào)用復(fù)制構(gòu)造函數(shù)。它也是構(gòu)造器。當(dāng)用一個(gè)對(duì)象作為參數(shù)創(chuàng)建另一個(gè)對(duì)象或賦值(同樣關(guān)注創(chuàng)建)時(shí),例如C中的a(b)a b a=b,以下三種對(duì)象需要調(diào)用復(fù)制構(gòu)造函數(shù)(有時(shí)也稱為“復(fù)制構(gòu)造函數(shù)”):
1)對(duì)象用作函數(shù)參數(shù)并傳遞到函數(shù)體中以值傳遞的方式;
2)對(duì)象用作函數(shù)的返回值,并通過(guò)值傳遞從函數(shù)返回;
3)對(duì)象用于初始化另一個(gè)對(duì)象(通常稱為賦值初始化);-直接調(diào)用函數(shù)和定義后續(xù)調(diào)用有什么區(qū)別?很難說(shuō)編譯器在復(fù)制S1時(shí)調(diào)用了S2復(fù)制方法。
為什么復(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)在回到您的問(wèn)題,賦值構(gòu)造函數(shù)也是一種構(gòu)造函數(shù),你給它一個(gè)非引用、非指針的參數(shù),它會(huì)調(diào)用這種類型的構(gòu)造函數(shù),這很好~一個(gè)函數(shù)不斷地調(diào)用自己,這樣它就不會(huì)出錯(cuò),就不會(huì)堆棧溢出了,是嗎?簡(jiǎn)單來(lái)說(shuō),事情是這樣的:intfun(MyClass a){fun(a)}//你認(rèn)為這個(gè)函數(shù)有一天會(huì)結(jié)束嗎?