C++---拷貝構造函數和賦值構造函數


摘要:最近看了一道面試題問: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
賦值構造函數實例(值傳遞)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM