摘要:最近看了一道面試題問:C++ 中拷貝賦值函數的形參能否進行值傳遞?我知道一般來說,拷貝構造函數的形參必須是自身類型的引用(《面向對象程序設計--C++語言描述(第二版)》這本書中有敘述),但是拷貝賦值函數的形參通常也是自身類型的引用,那么我們到底能不能將它們的形參改為值傳遞呢?
1,拷貝構造函數(不能進行值傳遞)
拷貝構造函數的原型有兩種:
1 // 拷貝構造函數原型 2 Person( Person& ); // method 1 3 Person( const Person& ); // method 2 4 5 // 下面這種原型是錯的 6 Person( Person ); // 不能進行值傳遞,只能傳遞引用
不能進行值傳遞的原因:如果自身參數不是引用,則永遠不會調用成功------為了調用拷貝構造函數,我們必須拷貝它的實參,但為了拷貝實參,我們又必須調用拷貝構造函數,如此無限循環。
2,拷貝賦值函數(能進行值傳遞)
拷貝賦值函數的原型:
1 // 拷貝賦值函數原型 2 Person& operator=( const Person& );
為了與內置類型的賦值保持一致,賦值運算符通常返回一個指向其左側運算對象的引用,這樣就可以實現連等的功能(a = b = c)
為了驗證我們的猜測(能進行值傳遞),我們做了一下驗證,代碼如下:

1 #include <iostream> 2 using namespace std; 3 4 class A { 5 public: 6 A():a(0){} 7 A(int k) {a = k;} 8 A& operator=(A other){ // 進行值傳遞而非引用傳遞 9 this->a = other.a; 10 } 11 int get(){return a;} 12 ~A(){} 13 private: 14 int a; 15 }; 16 17 int main(){ 18 A a1(1); // a1.get() == 1 19 A a2; // a2.get() == 0 20 a2 = a1; 21 cout << a2.get() <<endl; 22 return 0; 23 } 24 25 // 輸出結果 26 // 1