簡體   English   中英

復制私有類語法中的構造函數

[英]Copy constructor in private class Syntax

2小時后,我將參加C ++考試,但我仍然想知道復制構造函數的語法。

到目前為止,我了解的是您將CopyConstructor設置為私有,這樣,當某個函數或任何想要復制您的類的對象將無法正常工作,因為它將無法訪問私有變量。 因此,您可以檢查是否錯過了僅會進行淺表復制的指針。

到現在為止還挺好。

現在我讀的語法是

ClassName(const ClassName &)

我想知道為什么您要在其中包含&符和const。 僅僅ClassName(ClassName)不夠嗎?

從C ++ 14中的[class.copy] / 2:

如果類X非模板構造函數的第一個參數為X&const X&volatile X&const volatile X& ,並且沒有其他參數,或者所有其他參數都具有默認參數,則為復制構造函數。

因此,根據語言的定義,您的建議將不是復制構造函數。

實際上,根據[class.copy] / 6,您的建議格式不正確:

如果類X的構造函數的第一個參數是X類型(可選,具有cv限定),並且沒有其他參數,或者所有其他參數都具有默認參數,則聲明的格式不正確。

為了通過值傳遞某些東西,您需要能夠復制它。 我們如何制作副本? 復制構造函數! 因此,如果我們定義類似ClassName(ClassName)的復制構造函數,則傳入一個ClassName ,調用復制構造函數,后者將調用復制構造函數...

這導致無限遞歸; 不是一種非常合理的復制對象的方式。 這就是我們通過引用傳遞的原因:因此我們不需要制作任何其他副本。 const之所以存在,是因為復制對象不應修改它,否則您將得到類似於auto_ptr可怕內容。

此外,對於C ++ 11,最好使用=delete來阻止人們復制您的類,而不是將復制構造函數設為私有:

ClassName (const Classname&) = delete;

語法f(Classname)表示復制了參數,而f(const Classname&)引用了該參數。

但是,復制提供給復制構造函數的參數將是非常糟糕的,該參數應該定義如何制作這種復制...

const意味着您還可以制作一個常量類的副本(並且您保證不會修改要復制的類。

&表示&表示您的復制構造函數將引用其要復制的內容(沒有&符將獲取其副本,這在我們實際上試圖復制時是不可能的)。

我想知道為什么你那里有&號和const

“&”號表示要復制的對象是通過引用傳遞的。 const表示該引用不能用於修改它。 這就是您復制時所期望的。

僅僅ClassName(ClassName)不夠嗎?

那將意味着對象按值傳遞。 為此,必須將其復制。 要復制它,您必須調用復制構造函數。 為此,您必須按值傳遞對象。 為此,必須將其復制。 等等。

所以不,復制構造函數不能按值獲取其參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM