簡體   English   中英

cpp中的默認構造函數是淺拷貝還是深拷貝?

[英]Default constructor in cpp shallow or deep copy?

默認的復制構造函數是否在C ++中執行淺拷貝或深拷貝?

我真的對cpp中的默認復制構造函數感到困惑,因為它像我執行v2=v1;一樣進行淺表復制或深表復制v2=v1; 假設v1={1,2,3} ,如果我已經完成v2[0]=1; 它沒有得到反映,但我聽過它是淺表抄本,有人可以解釋嗎?

它也不做。 它會進行成員復制。 即,它使用其復制構造函數復制該類的所有成員。 如果這些成員具有執行深層復制的副本構造函數,那么您將獲得深層副本;如果他們進行淺層復制,則您將獲得淺層副本,或者他們可以完全執行其他操作。

深層復制和淺層復制不是C ++概念,而是C ++使您可以根據需要進行深層或淺層復制。

您的問題是錯誤的問題。

首先,C ++默認復制/分配是成員方式的; 它根據成員的操作遞歸地復制/分配。

精心設計的C ++類型在復制/分配時會遵循幾種模式,並與3種不同的原始類型對齊。 值,請參考amd指針語義。

值語義類型的行為類似於值。 這大致相當於您的“深層副本”。 遵循值語義修改一個變量永遠不會更改另一個變量。 std::vector是一種值語義類型,如intdoublestd::string和其他std容器類型一樣。 值語義是一種強大的模式,它使對程序行為的推理變得容易。 注意,值語義不必實現為值。 向量通常以三重指針的形式實現,而構造/復制/等過載。

引用語義類型的行為類似於C ++引用類型int& 這與Java / C#參考不同。 C ++引用是別名。 int& a=b; 表示ab別稱。 然后a=7使ab等於7 如果您還有另一個引用c ,則a=c不會重新綁定a來引用c 它將改變a具有的值與c具有的值相同。

具有引用語義的復雜對象很少。

指針語義類似於引用語義,但是賦值會重新綁定它指向的對象。 有時需要其他操作(如& )來創建新的指針。 具有指針語義的類型包括std::reference_wrapperstd::string_viewstd::shared_ptr<double>gsl::span<char>int*

通常,將具有不同語義的成員混合在同一類型中是一個壞主意; 0/3/5規則指出最佳移動/復制/關聯/ ctor / dtor是空的。 您的資源管理類型使用RAII並編寫那些特殊成員,其他類型則將它們聚集在一起。 值語義類型不與引用/指針混合使用,以使復合類獲得一致的語義。

TL; DR:這取決於。 閱讀您會員的文檔。 記錄您的類型具有什么語義,以便用戶知道期望什么。

但是請注意,引用語義與存儲在std容器中不兼容。

隱式生成的副本構造函數(和賦值運算符)執行淺表副本。

值類型的淺表副本和深表副本之間沒有區別。

現在,如果我完成了v2 [0] = 1; 它沒有得到反映

除非v2的類型是引用類型,否則沒有理由期望這種操作得到反映

暫無
暫無

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

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