在c++賦值運算符函數的學習中,對於返回值類型的問題,一直非常費解,今天徹底總結一些每種不同返回值類型的結果:
1、當返回值爲空時:
<span style="font-size:14px;">void hasptr::operator=(const hasptr& s)</span>
這個時候如果只有一個‘=’(a = b)運算那就沒問題,但是如果存在‘=’(a = b = c)的鏈式操作時,編譯器就會報錯
我們看:a = b = c;
程序會先運行 b = c;
因爲函數的返回值爲viod , 所以 b = c這個操作就會返回一個NULL
那麼這是 a = (b = c) 也就是 a = NULL , 這種操作時不存在的 , 即使是存在也不符合我們對這個操作的初衷。
2、當返回值是 類本身時:
<span style="font-size:14px;">hasptr hasptr::operator=(const hasptr& s)</span>
支持‘=’的鏈式操作
如果返回值是類本身 , 那麼這個函數運行的過程是:
1、進入函數內部,運行函數內部的操作
2、函數內部的操作運行完之後,調用類的拷貝構造函數,把對象拷貝給一個新的對象
3、返回那個新建立的對象
這裏是關鍵是,每運行一次賦值運算符函數,就要調用一次拷貝構造函數,這樣不僅會浪費時間。
如果類中沒拷貝構造函數,有時候還會出錯。
3、當返回值是引用時
<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)</span>
這種方式是最好的 , 即支持鏈式操作,還把操作時間降到了最低
完整代碼:
<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)
{
i = s.i;
string *x = new string(*s.ps);
delete ps;
ps = x;
return *this;
}</span>