運算子過載 函式返回值

2021-07-08 21:04:02 字數 2667 閱讀 7550

舉例

#include 

using namespace std;

class test ;

test operator + (test& temp1, test& temp2)

test& operator ++ (test& temp)

int main()

【結果1】vs2005執行結果:

【結果2】

更改++過載函式為返回值,即test operator ++ (test& temp), vs2005執行結果如下:

main的流程為:

(1) 建立物件a        //建構函式

(2) 呼叫operator + 函式,函式中建立result

區域性物件result(

0013fd70)--

>函式返回之時,拷貝建構函式建立物件 (0013febc)-->

test c = a + a把物件(0013febc)賦值給物件c

-->析構result物件 

(3) 呼叫operator ++ 函式,在返回之時,使用形參temp (物件c)建立臨時物件

-->析構臨時物件

由上可以得出

(1) 

返回值的被調函式返回時,會呼叫拷貝建構函式產生臨時變數;返回後,如果臨時變數沒有被「保留」下來,則會被析構,同時被調函式內部的區域性物件也被析構。

(2) 與

返回引用的operator ++函式相比,返回值的被調函式

不產生臨時物件

【結果3】

把+過載函式改為返回引用,即friend test& operator + (test &,  test &),vs2005執行結果如下:

返回引用的operator +函式:

建立區域性變數result (0013fda0)-->函式返回,析構result。  //不呼叫拷貝建構函式

賦值語句test c = a + a; 

呼叫拷貝建構函式,建立c物件 (0013febc)。 //上面結果出錯的原因在於拷貝建構函式的引數代表的物件已經被析構了。

【結論】

明白了:返回值和返回引用的區別在於,如果返回

值,那麼被調函式在返回之前需要構造乙個臨時「值」,這個「值」如果是某個類物件,則需要呼叫拷貝建構函式;如果返回

引用,那麼被調函式在返回之前需要儲存乙個「引用」型別的臨時變數。既然返回型別與區域性變數型別無關,那麼這個區域性變數還有什麼用呢?就釋放了吧。因此,在函式返回時,區域性物件就被釋放了。

函式返回時的動作: return語句向函式出口的返回型別守門人報告,

值返回守門人說:」需要返回物件值,你等一下啊!」,於是區域性物件在門口等著,值返回守門人告訴主調函式可以返回了,於是主調函式呼叫拷貝建構函式把等在被調函式出口的區域性物件拷貝下來,之後被調函式釋放區域性物件空間。如果是

引用返回守門人,見到return的物件則會說:」需要返回引用型別,把位址給我,你可以走啦!」,於是區域性物件把自己的地扯牌(引用的值)留下,自己釋放了。主調函式從引用返回守門人那裡得到的只是乙個位址。一般,主調函式不需要被調函式的區域性變數位址,在不關心被調返回值時,這沒關係,還有就是像operaor++的情況,返回的是入參的位址,這是正確的位址。總之,函式返回值會強制轉化為函式宣告返回值型別,只要保證主調函式需要的型別不會在被調返回時釋放就對了!

一般來說

,當返回值不是本函式內定義的區域性變數時就可以返回乙個引用。在通常情況下

,引用返回值只用在需對函式的呼叫重新賦值的場合,也就是對函式的返回值重新賦值的時候。

如果返回值:返回的區域性物件,在賦值語句結束之後釋放,函式返回時儲存的臨時變數為該物件;

如果返回引用:返回的區域性物件,在函式返回時釋放,函式返回時儲存的臨時變數為該物件的引用(位址);

【指標】

在使用引用引數的場合,假如使用指標的話,可以只傳遞位址,不複製資料,這對於一般的函式沒有任何問題,但是過載運算子卻不能對指標單獨操作。

修改+過載函式修改為:friend test operator + (test *,  test*);  vs2005編譯報錯如下:

1>e:\testing\main\main.cpp(10) : error c2803: 「operator +」必須至少有乙個類型別的形參

1>e:\testing\main\main.cpp(18) : error c2803: 「operator +」必須至少有乙個類型別的形參

1>e:\testing\main\main.cpp(34) : error c2110: 「+」: 不能新增兩個指標

賦值運算子的返回值問題

最近看到c 的運算子過載,賦值運算子如 為什麼operator operator 的返回值必須是物件的引用,書上說是保證這樣的表示式賦值a b c,我把返回值改為按值返回,也能通過啊。今天在看劍指offer時突然被這個問題困惑,為此上網查查,特此記錄一下。話不多說,先貼上 cmystring ope...

C 運算子過載函式基礎及其值返回狀態

運算子過載是c 的重要組成部分,它可以讓程式更加的簡單易懂,簡單的運算子使用可以使複雜函式的理解更直觀。對於普通物件來說我們很自然的會頻繁使用算數運算子讓他們參與計算,但是對於自定義類的物件來說,我們是無論如何也不能阻止寫出像下面的 一樣的程式來的。例子如下 class test intmain 當...

C語言賦值運算子的返回值

今天看c陷阱與缺陷,又看到了一處提到strcpy,下面有庫裡面的實現的 這是整理過的,不是原書的 char strcpy char dest,const char src while dest src 0 這一句讓我想了很久,以前一直認為賦值運算子返回的是是否複製成功,現在看起來它應該返回的是左值的...