[英]Why not a consolidated Copy constructor and Assignment operator available in C++?
我確實理解將調用各個函數(復制構造函數和賦值運算符)的場景。 這兩個函數實際上都在執行相同的功能 - 為動態數據成員正確分配內存並從傳遞的參數對象復制數據,這樣對象在數據中看起來都相同。 為什么不在這種情況下,C ++提供了一個統一的(一個函數),在這兩個場景中都會調用它,而不是通過提供兩個變體來復雜化?
它們不一樣,如果有人強迫它們,那將是一種痛苦。
復制構造是一種創建對象的方法。 除此之外,還可以使用基本成員初始化程序。 在多線程代碼中,您不必過多擔心構造函數中的互斥單元,因為您無法同時創建相同的對象!
賦值運算符做了一件完全不同的事情。 它對已經存在的對象進行操作, 並且應該返回對self的引用 。 一個實現可以在這里做一些微妙的不同的事情cf. 復制建設。 例如,如果新分配的字符串較小,則字符串類可能不會釋放資源。
在簡單的情況下,它們可能會做同樣的事情,並且丟棄了賦值的返回值。 但在這種情況下,您可以依賴編譯器自動生成的那些。
他們是如此不一樣的。 在特殊情況下它們可能是相同的,但通常不是。
當你有這樣的事情時:
std::vector myVec = myOtherVec;
它看起來像賦值,但實際上正在調用復制構造函數。
復制構造函數從無啟動對象 。
這可以追溯到malloc
(舊C方式保留內存)和new
方法之間的區別這個基本問題。 不同之處在於: new
調用對象的構造函數,這在C ++中非常重要,否則我們將討論除非明確指出,否則無法初始化的垃圾內存。
例如,在std::vector
的內部實現中,有一個size
變量,用於跟蹤用戶使用push_back()
或resize
(我們不是在討論保留)時主動確認的元素數量。
現在想象它是如何實現的:
template <typename T>
class vector
{
int size;
T* theArray;
void reserveMyMemory(); //ignoring allocators for simplicity
}
復制構造函數和賦值運算符之間有什么區別?
現在imageine內存預留需要檢查的size
和是否theArray
是nullptr
。 如果內部使用賦值運算符會發生什么? 一場災難。 因為值未初始化。 所以,你需要一個構造函數來啟動。
在這種情況下,復制構造函數更通用,因為它應該初始化變量 ,然后復制它必須復制的元素。 當然,這整個例子只是一個示范。 不要把字面意思用於std::vector
,STL不能那樣工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.