[英]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.