簡體   English   中英

提供賦值運算符,但不提供復制構造函數

[英]providing assignment operator but no copy constructor

在這里讀到,如果我不編寫副本構造函數,則編譯器將使用賦值運算符為我完成此操作,這將導致對象的淺表副本。 如果我的所有成員對象中的賦值運算符都重載了怎么辦? 會不會導致深度復制?

如果我不編寫副本構造函數,則編譯器將使用賦值運算符為我完成該操作

不,它不使用賦值運算符; 它是通過隱式生成的復制構造函數完成的,該復制構造函數進行淺表復制。

如果我的所有成員對象中的賦值運算符都重載了怎么辦? 會不會導致深度復制?

假定在沒有顯式定義的副本構造函數的情況下不使用賦值運算符,即使您已重載了賦值運算符,您仍然仍然需要重載副本構造函數。

三的規則在C ++ 03& 的5種規則在C ++ 11。

鏈接文章中的重要部分是“使用賦值運算符分別使用類的每個成員 ”。 因此,是否為類定義了賦值運算符都沒有關系,它將為該類的每個成員使用賦值運算符。

你誤會了。 隱式生成的構造函數和賦值運算符僅對所有成員和子對象遞歸執行構造或賦值:

  • 復制構造函數逐個元素地復制

  • 移動構造函數逐個元素地移動

  • 復制分配逐元素分配

  • 逐元素移動分配move-assigns

這就是為什么最好的設計是您自己不編寫任何副本構造函數(或其他三個副本或析構函數中的任何一個),而是組成精心挑選的單一職責類的原因的原因自己的語義負責一切。

暫無
暫無

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

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