0

什麼是這樣做的區別時:拷貝構造函數/賦值運算符混淆初始化對象

class_name object_name = something; 

class_name object_name(something); 

從我讀here,都使用拷貝構造函數,但我不知道了解爲什麼會發生,以及隱式轉換如何發揮作用。我怎麼理解它(在閱讀它之前)是第一次使用默認賦值運算符(如果未定義的話)通過創建一個臨時對象然後調用複製構造函數,但似乎是錯誤的。我問,因爲我讀到,當明確複製構造函數時,第一個選項將失敗,即使是某種類型的類型,所以這兩個選項必須不同。在第一個選項中,複製構造函數頂部還使用了賦值運算符(使用默認還是用戶定義的實現),還是僅僅是調用複製構造函數的用戶友好語法形式?

+1

這取決於什麼'something'是。看到這[gotw](http://www.gotw.ca/gotw/036.htm)。但都不涉及到賦值運算符的調用。 – juanchopanza

回答

1

如果拷貝構造函數是明確的,第一種形式只能通過寫作實現:

class_name object_name = class_name(something); 

即顯式調用拷貝構造函數。最後,如果複製構造函數是顯式的,只要使用第一種形式(如果這是明確的解析),或者對於額外的C++ 11個使用大括號的初始化語法,它可以從未有歧義:

class_name object_name{something}; 

或使用香草薩特的「幾乎總是自動」的想法:

auto object_name = class_name{something}; 

爲了回答您的其他問題,轉讓或複製賦值運算符在這裏不使用。拷貝賦值運算符用在你指定的副本之前初始化變量:

class_name object_name; 
object_name = class_name(something); // uses class_name& operator= (class_name& other) 
+0

很高興知道。爲什麼如果構造函數是顯式的,我不能使用第一個選項?我認爲明確制定功能意味着我們限制轉換。我只是沒有得到與我們的第一種選擇有關的事情,因爲「某些事物」具有正確的類型。 – Veritas

+0

爲此,請參閱此問題的答案:http://stackoverflow.com/questions/4153527/explicit-copy-constructor-behavior-and-pratical-uses – polkadotcadaver

+0

-1賦值運算符在此處不使用,句點。 – jrok

1

拷貝構造函數和賦值操作符是不一樣的東西。

Test(const Test &t) 
    { 
     std::cout<<"Copy constructor called "<<std::endl; 
    } 
    Test& operator = (const Test &t) 
    { 
     std::cout<<"Assignment operator called "<<std::endl; 
     return *this; 
    } 

    Test t1, t2; 
    t2 = t1; 
    Test t3 = t1; 

在這個例子中,賦值操作符被調用t2 = t1和拷貝構造函數被調用t3 = t1

如果你把拷貝構造函數明確的,你必須調用它像這樣:

Test t3(t1); 
相關問題