[英]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
是一種值語義類型,如int
, double
, std::string
和其他std
容器類型一樣。 值語義是一種強大的模式,它使對程序行為的推理變得容易。 注意,值語義不必實現為值。 向量通常以三重指針的形式實現,而構造/復制/等過載。
引用語義類型的行為類似於C ++引用類型int&
。 這與Java / C#參考不同。 C ++引用是別名。 int& a=b;
表示a
是b
別稱。 然后a=7
使a
和b
等於7
。 如果您還有另一個引用c
,則a=c
將不會重新綁定a
來引用c
; 它將改變a
具有的值與c
具有的值相同。
具有引用語義的復雜對象很少。
指針語義類似於引用語義,但是賦值會重新綁定它指向的對象。 有時需要其他操作(如&
)來創建新的指針。 具有指針語義的類型包括std::reference_wrapper
, std::string_view
, std::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.