賦值運算符函數的返回值類型詳解

在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>


發佈了189 篇原創文章 · 獲贊 17 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章