2013-10-27 67 views
-1

好吧,我在閱讀「effective C++」,第12項說請不要在拷貝構造函數中調用拷貝賦值。但是在我嘗試這樣做之後,它確實有效。所以我想問爲什麼,我不能在複製構造函數中重用複製分配代碼?C++:複製構造函數中的調用拷貝賦值

+1

我認爲這是因爲可能更有效的成員初始化通過在初始化程序列表中直接複製它們。 –

+6

我有一種感覺,這在「Effective C++」的第12項中有很好的解釋。 – juanchopanza

+1

希望所有的答案都會或多或少地解釋斯科特在那裏解釋過的東西_Item 12_ – P0W

回答

0

假設您在複製構造函數中使用了複製賦值運算符。然後,你失去了實施的賦值操作符copy-and-swap成語的能力:

struct A 
{ 
    A (const A &a) 
    { 
    *this = a; // Assignment to a not yet constructed object is not well 
    } 

    A &operator=(A a) // Pass by value 
    { 
     // ... 
    } 
}; 

A a1, a2; 
a1 = a2; // Infinite recursion! 

這是不可能的,並會出現無限遞歸。

+1

謝謝,我認爲它很有用。如果參數是通過值傳遞的,它會導致無限遞歸,並且不適合分配給不是構造對象。對不起,我沒有足夠的聲望投票。 – lingjieyu

0

構造函數創建一個新對象;賦值運算符修改現有對象。你不能使用賦值操作符來創建一個新對象:即使它看起來可以在簡單情況下工作,它也不知道如何去做。