2012-06-08 79 views
9

我正在學習C++,並正在從C++: The Complete Reference讀取複製構造函數。這些書說使用多個參數複製構造函數

只要複製構造函數具有爲它們定義的默認參數,就可以有附加參數。但是,在所有情況下,第一個參數必須是對進行初始化的對象的引用。

但我很困惑,我們將如何通過這些額外的參數?我確信應該有某種方法,這在書中沒有給出,我也無法弄清楚。誰能幫我嗎?

編輯: 也是它能夠在所有三種情況,即

  • 當一個對象明確初始化其他,如在聲明
  • 通過這些額外的參數,當一個對象的副本由要被傳遞到功能
  • 當生成臨時對象(最常見的,作爲返回值)
+1

_Herbert Schildt_的書由[社區] [向下看](http://www.seebs.net/c/c_tcn4e.html)(http://stackoverflow.com/questions/18385418/c-meaning-對的一語句結合-的typedef和類型名稱#comment26999919_18385418)。這是因爲每一頁的錯誤數量很大,這是它所宣稱的不好的做法。 [The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?rq=1)應該幫助你選擇一個好的。 – legends2k

回答

13

下面是一個簡單的例子:

class A { 
    //... 
public: 
    A (const A&, bool deep = false) { 
     if (!deep) { /* make a shallow copy */ } 
     else { /* make a deep copy */ } 
    } 
}; 

void foo (A x) { /*...*/ } 
A bar() { /*...*/ return A(); } 
A a_var; 

在這個例子中,該參數默認爲false,表示默認的拷貝構造函數會變淺。

A b(a_var);  // b gets a shallow copy of a 
foo(b);   // foo() receives a shallow copy 

但是,通過在第二個參數中傳遞true可以實現深度複製。

A b(a_var, true); // b gets a deep copy of a 
foo(A(b, true)); // foo receives a shallow copy of a deep copy 

同樣,對於返回一個A的函數,返回的副本將是淺薄的,因爲它使用的是默認的,但是當它接收到它的接收器可以使深。

A b(bar());  // shallow 
A b(bar(), true); // deep 

記住,當你定義一個拷貝構造函數,這很可能意味着你需要定義一個析構函數,並重載賦值運算符(三個規則)。

+0

以及其他兩種情況,即通過值和返回對象將對象傳遞給函數? ...我已經更新了相同的問題。 –

+0

@RaviGupta:感謝您的輸入,編輯。 – jxh

1

想想這樣:只有構造函數的概念。當編譯器決定需要創建副本時,它會查找可以通過傳入類型爲T的單個對象來調用的構造函數。由於這個特殊用例,我們通常會調用構造函數來選擇一個「複製」構造函數。