五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C/C++編程筆記:詳細(xì)講解丨復(fù)制構(gòu)造函數(shù)

2021-04-23 19:44 作者:C語(yǔ)言編程__Plus  | 我要投稿



什么是復(fù)制構(gòu)造函數(shù)??

復(fù)制構(gòu)造函數(shù)是一個(gè)成員函數(shù),它使用相同類的另一個(gè)對(duì)象初始化一個(gè)對(duì)象。復(fù)制構(gòu)造函數(shù)具有以下常規(guī)函數(shù)原型:?

? ? ClassName(const ClassName&old_obj);

以下是復(fù)制構(gòu)造函數(shù)的一個(gè)簡(jiǎn)單示例:


輸出:?

p1.x = 10, p1.y = 15

p2.x = 10, p2.y = 15


復(fù)制構(gòu)造函數(shù)何時(shí)?調(diào)用?

在C ++中,在以下情況下可以調(diào)用復(fù)制構(gòu)造函數(shù):?

1.當(dāng)類的對(duì)象按值返回時(shí)。?

2.當(dāng)類的對(duì)象通過(guò)值作為參數(shù)傳遞(傳遞給函數(shù))時(shí)。?

3.基于同一類的另一個(gè)對(duì)象構(gòu)造一個(gè)對(duì)象時(shí)。?

4.編譯器生成臨時(shí)對(duì)象時(shí)。

但是,不能保證在所有這些情況下都將調(diào)用復(fù)制構(gòu)造函數(shù),因?yàn)镃 ++標(biāo)準(zhǔn)允許編譯器在某些情況下優(yōu)化復(fù)制,一個(gè)例子是返回值優(yōu)化(有時(shí)稱為RVO)。?

當(dāng)是一個(gè)需要用戶定義的副本構(gòu)造函數(shù)嗎?

如果我們不定義自己的副本構(gòu)造函數(shù),則C ++編譯器會(huì)為每個(gè)類創(chuàng)建一個(gè)默認(rèn)的副本構(gòu)造函數(shù),該類在對(duì)象之間進(jìn)行成員級(jí)復(fù)制。編譯器創(chuàng)建的復(fù)制構(gòu)造函數(shù)通常可以正常工作。僅當(dāng)對(duì)象具有指針或文件句柄,網(wǎng)絡(luò)連接等資源的任何運(yùn)行時(shí)分配時(shí),才需要定義我們自己的副本構(gòu)造函數(shù)。

默認(rèn)構(gòu)造函數(shù)僅執(zhí)行淺表復(fù)制。


只有用戶定義的副本構(gòu)造函數(shù)才可以進(jìn)行深層復(fù)制。在用戶定義的副本構(gòu)造函數(shù)中,我們確保所復(fù)制對(duì)象的指針(或引用)指向新的內(nèi)存位置。??


復(fù)制構(gòu)造函數(shù)與賦值運(yùn)算符

以下兩個(gè)語(yǔ)句中的哪一個(gè)調(diào)用復(fù)制構(gòu)造函數(shù),而哪一個(gè)調(diào)用賦值運(yùn)算符??

MyClass t1, t2;

MyClass t3 = t1; // ----> (1)

t2 = t1; // -----> (2)

從現(xiàn)有對(duì)象創(chuàng)建新對(duì)象作為現(xiàn)有對(duì)象的副本時(shí),將調(diào)用復(fù)制構(gòu)造函數(shù)。當(dāng)已初始化的對(duì)象從另一個(gè)現(xiàn)有對(duì)象中分配了新值時(shí),將調(diào)用賦值運(yùn)算符。在上面的示例中,(1)調(diào)用復(fù)制構(gòu)造函數(shù),(2)調(diào)用賦值運(yùn)算符。

寫(xiě)一個(gè)需要復(fù)制構(gòu)造函數(shù)的示例類嗎??

以下是一個(gè)完整的C ++程序,以演示Copy構(gòu)造函數(shù)的用法。在下面的String類中,我們必須編寫(xiě)副本構(gòu)造函數(shù)。?


輸出:?

GeeksQuiz

GeeksQuiz

GeeksQuiz

GeeksforGeeks

如果我們從上述代碼中刪除復(fù)制構(gòu)造函數(shù),那將會(huì)是什么問(wèn)題?

如果從上面的程序中刪除copy構(gòu)造函數(shù),則不會(huì)獲得預(yù)期的輸出。對(duì)str2所做的更改也反映在str1中,這是意料之外的。

輸出:?

GeeksQuiz

GeeksQuiz

GeeksforGeeks

GeeksforGeeks

我們可以將復(fù)制構(gòu)造函數(shù)設(shè)為私有嗎?

是的,可以將復(fù)制構(gòu)造函數(shù)設(shè)為私有。當(dāng)我們?cè)谝粋€(gè)類中將復(fù)制構(gòu)造函數(shù)設(shè)為私有時(shí),該類的對(duì)象將變?yōu)椴豢蓮?fù)制。當(dāng)我們的類具有指針或動(dòng)態(tài)分配的資源時(shí),這特別有用。在這種情況下,我們可以像上面的String示例一樣編寫(xiě)我們自己的副本構(gòu)造函數(shù),也可以創(chuàng)建一個(gè)私有副本構(gòu)造函數(shù),以便用戶獲得編譯器錯(cuò)誤,而不是在運(yùn)行時(shí)感到意外。?

為什么必須將復(fù)制構(gòu)造函數(shù)的參數(shù)作為引用傳遞?

按值傳遞對(duì)象時(shí),將調(diào)用復(fù)制構(gòu)造函數(shù)。復(fù)制構(gòu)造函數(shù)本身就是一個(gè)函數(shù)。因此,如果我們?cè)趶?fù)制構(gòu)造函數(shù)中按值傳遞參數(shù),則將調(diào)用復(fù)制構(gòu)造函數(shù)來(lái)調(diào)用復(fù)制構(gòu)造函數(shù),這將成為一個(gè)無(wú)終止的調(diào)用鏈。因此,編譯器不允許參數(shù)按值傳遞。

以上就是今天的全部?jī)?nèi)容了。每日分享小知識(shí),希望對(duì)你有幫助~

另外如果你想更好的提升你的編程能力,學(xué)好C語(yǔ)言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~

微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地

分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!



C/C++編程筆記:詳細(xì)講解丨復(fù)制構(gòu)造函數(shù)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
莒南县| 东城区| 兴义市| 昆山市| 兰坪| 满城县| 云霄县| 晋宁县| 乌拉特前旗| 若尔盖县| 顺义区| 合肥市| 武汉市| 正安县| 张家港市| 东海县| 内乡县| 莱阳市| 班玛县| 丹凤县| 高雄市| 林周县| 大关县| 石柱| 沙湾县| 河间市| 安化县| 孟津县| 定结县| 洛川县| 格尔木市| 颍上县| 平遥县| 固安县| 祥云县| 五峰| 祁连县| 白沙| 宁陵县| 牟定县| 广安市|