簡體   English   中英

為什么C ++中沒有合並的Copy構造函數和賦值運算符?

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

復制構造函數和賦值運算符之間有什么區別?

  • 賦值運算符:只復制大小和數組內容。
  • Copy-cosntructor:必須保留內存並初始化變量,然后復制。

現在imageine內存預留需要檢查的size和是否theArraynullptr 如果內部使用賦值運算符會發生什么? 一場災難。 因為值未初始化。 所以,你需要一個構造函數來啟動。

在這種情況下,復制構造函數更通用,因為它應該初始化變量 ,然后復制它必須復制的元素。 當然,這整個例子只是一個示范。 不要把字面意思用於std::vector ,STL不能那樣工作。

暫無
暫無

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

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