2013-05-04 49 views
0

的我寫一個代碼來測試使用賦值操作符和拷貝構造函數。代碼如下:懷疑的代碼來測試使用賦值運算符

#include <iostream> 
#include <algorithm> 
using namespace std; 

class fun { 
    int i; 
    public: 
     fun():i(1) {i=1;cout<<"in: cons\n";} 
     ~fun() {cout<<"in: des\n";} 
     fun& operator=(fun b) { 
       cout<<"in: assignOp\n"; 
       swap(this->i, b.i); 
       return *this; 
     } 
     fun(fun& b) { 
       cout<<"in: copy cons\n"; 
       b.i = this->i; 
     } 
     void print() { 
       cout<<i<<endl; 
     } 
}; 

main() 
{ 
    fun A; 
    fun B; 
    B = A; 
    A.print(); 
} 

這裏是代碼的輸出:

在:利弊

在:利弊

中:複製利弊

在:assignOp

在:DES

-1216991244

在:在Des

:DES

現在,有兩件事情,我無法理解有關的輸出。

首先,爲什麼是代碼要在拷貝構造函數? 其次,爲什麼'i'的值被打印爲垃圾而不是'1'?

我是一個新手,所以原諒我,如果我的疑問是顯而易見的。

+1

你的賦值運算符,除了在答案中描述的問題,是不是實際上是_assignment_。如果你想做一個交換,那麼你應該做一個'交換'功能。改變操作符的語義不僅會讓其他人感到困惑,它可能會讓你自己在幾個月後感到困惑。 – 2013-05-04 16:08:43

回答

2
B = A; 

這導致調用操作符被調用。在輸出中看到copy cons的原因是因爲您的賦值運算符按值取其參數。所以A被複制到賦值運算符函數中,這需要使用複製構造函數。

兩個拷貝構造函數和拷貝賦值運算符通常由const參考把他們的論點。

你得到的垃圾值的原因是因爲你有這條線向後:

b.i = this->i; 

它應該是:

this->i = b.i; 

否則,你的拷貝構造函數拷貝this->i不定值進入您從中複製的對象。

1

首先,爲什麼是代碼要在拷貝構造函數?

複製構造函數在爲賦值運算符複製參數時被調用。你是按值傳遞的參數賦值運算符,而不是一個參考:的

fun& operator=(fun b) 

代替

fun& operator=(const fun& b) 

其次,爲什麼「我」的價值正在被打印成垃圾而不是'1'?

在你的拷貝構造函數,你周圍的分配方式不對:的

b.i = this->i; 

代替

this->i = b.i;