2014-04-14 35 views
4

這是怎麼MyClass定義拷貝構造函數:爲什麼被用來代替賦值運算符

class MyClass { 
    double x, y; 
    public: 
     MyClass (double a = 0., double b = 0.) { 
      x = a; 
      y = b; 
      cout << "Using the default constructor" << endl; 
     } 
     MyClass (const MyClass& p) { 
      x = p.x; 
      y = p.y; 
      cout << "Using the copy constructor" << endl; 
     } 
     MyClass operator =(const MyClass& p) { 
      x = p.x; 
      y = p.y; 
      cout << "Using the assignment operator" << endl; 
      return *this; 
     } 
}; 

我測試時,每個構造函數或方法被稱爲在我的主要程序:

int main() { 
    cout << "MyClass p" << endl; MyClass p; cout << endl; 
    cout << "MyClass r(3.4)" << endl; MyClass r(3.4); cout << endl; 
    cout << "MyClass s(r)" << endl; MyClass s(r); cout << endl; 
    cout << "MyClass u = s" << endl; MyClass u = s; cout << endl; 
    cout << "s = p" << endl; s = p; cout << endl; 
} 

爲什麼在第四個示例中使用的複製構造函數是MyClass u = s而不是賦值運算符?

編輯

包括輸出,問道:

MyClass p 
Using the default constructor 

MyClass r(3.4) 
Using the default constructor 

MyClass s(r) 
Using the copy constructor 

MyClass u = s 
Using the copy constructor 

s = p 
Using the assignment operator 
Using the copy constructor 
+6

因爲語言指定'Type var = value'調用'Type'的拷貝構造函數而不是它的賦值操作符。 –

+2

包括你的程序的輸出會很好。 – MondKin

+1

請注意,複製構造函數不需要被調用。編譯器可以優化它(參見[Copy elision](http://en.wikipedia.org/wiki/Copy_elision))。這是編譯器優化不會改變程序的可觀察行爲(在您的情況下是'cout'語句)的規則的一個例外。 – jrok

回答

8

因爲不是一個實際的任務,因爲你在同一時間宣佈ü。因此,調用構造函數而不是賦值運算符。而且這樣更有效率,因爲如果不是這個特性,那麼首先會調用一個默認的構造函數,然後再調用賦值操作符。這會引發不需要的副本的創建,因此會顯着惡化C++模型的性能。

3

因爲這是變量的聲明和初始化,而不是賦值給現有變量。在變量聲明的上下文中,=僅僅是將參數傳遞給ctor的語法糖。

+0

所以賦值運算符的使用總是與先前聲明的對象的存在相關聯? – dabadaba

+1

@dabadaba是的。分配意味着賦予現有變量新的價值。爲新變量賦值是初始化,這是ctors的工作。 – Manu343726

相關問題