這是怎麼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
因爲語言指定'Type var = value'調用'Type'的拷貝構造函數而不是它的賦值操作符。 –
包括你的程序的輸出會很好。 – MondKin
請注意,複製構造函數不需要被調用。編譯器可以優化它(參見[Copy elision](http://en.wikipedia.org/wiki/Copy_elision))。這是編譯器優化不會改變程序的可觀察行爲(在您的情況下是'cout'語句)的規則的一個例外。 – jrok