1. 程式人生 > >C++學習記錄19--運算子過載為什麼要使用引用(=)

C++學習記錄19--運算子過載為什麼要使用引用(=)

過載=運算子時,標準定義為

class A
{
public:
    A  & operator =(line &b)
}

這裡,賦值函式的返回值是引用和類的拷貝建構函式有關。
實際上,定義為無返回值void operator =(line &b)也可實現=運算子過載,但使用一個=號時沒有問題,使用兩個時有會型別不符

A a, b, c;
a=b=c;
//a=b=c等價於a=(b=c);

若返回值是void,則b=c後資料型別是void,則變成 A=void,報錯。
所以為了實現c++中連等的語法需要,講返回值定義為類的型別比較好。

有返回值時,為什麼一定要返回值是引用呢?

當執行到語句return *this;時,會自動呼叫類的拷貝建構函式。
但是萬一由於沒有定義拷貝建構函式 ,就會呼叫預設的拷貝建構函式。而預設的拷貝建構函式時當在類中有指標時就會出錯(淺拷貝)。
所以如果你不用引用做返回時,就必須自定義的深拷貝建構函式,以防類成員中有指標或引用資料導致出錯。

另外拷貝建構函式引數也必須引用A (A &a),否則在函式體中又會呼叫拷貝建構函式,無限迴圈。