2010-06-08 35 views
0

爲什麼我們使用複製構造函數?複製構造函數的優點和缺點是什麼?複製構造函數的缺點

+13

我們爲什麼不閱讀我們的C++教科書? – 2010-06-08 09:48:50

+1

我們使用複製構造函數來構造另一個對象的副本? – 2010-06-08 11:35:11

回答

3

的「缺點」是,對不可複製的類型,我們必須明確地禁止複製:

class Foo 
{ 
    // ... 

private: 

    Foo(const Foo&); 
    Foo& operator=(const Foo&); 
} 
0

我們使用定製拷貝構造函數,以便我們可以複製我們的對象。許多對象可以通過複製其數據成員來複制,因此可以依賴編譯器生成的默認複製構造函數,但有時這並不足以滿足需要。例如,一個對象可能有一些數據成員指向同一對象中的其他數據成員。簡單地將這樣的指針複製到目標對象將會使目標中的數據成員指向源對象中的數據成員。

例如:

class FastString { 
public: 
    ... 
    FastString(const FastString& s) : len_(s.len_) { 
     start_ = len_ > 8 ? new char[len_] : &insitu_; 
     memcpy(start_, s.start_, len); 
    } 
    ... 

private: 
    char *start_; 
    size_t len_; 
    char insitu_[8]; 
}; 
1

我只是讀這一點。我很確定這是正確的,連同其他答案。請注意,這與分配相同。

如果您沒有爲您創建的對象指定複製構造函數,然後嘗試複製它,編譯器可能會創建一個不適合您的對象的複製構造函數。

假如你有一個成員的類是一個指針,並且你沒有指定一個拷貝構造函數。如果編譯器決定簡單地複製對象,那麼指針也會指向與原始對象相同的內存,當內存針對一個對象釋放該指針時會導致各種麻煩,但它仍然是由另一個使用。

編輯:更新了這個以反映sbi的說法。我想其餘的都是正確的。

1

我能想到的複製構造函數的唯一缺點是一些大對象的複製可能很昂貴(例如,複製一個長字符串涉及分配大塊內存然後複製所有內容)。 C++ 0x使用移動構造函數在一定程度上解決了這個問題,它允許將一個對象的內容移入另一個對象,這通常是一種便宜的操作。