最近看到c++的運算子過載,賦值運算子如=,+=,-=,.....,為什麼operator=(),operator+=()...的返回值必須是物件的引用,書上說是保證這樣的表示式賦值a=b=c,我把返回值改為按值返回,**也能通過啊。
今天在看劍指offer時突然被這個問題困惑,為此上網查查,特此記錄一下。
話不多說,先貼上**
cmystring& operator=(const cmystring& str)
這是劍指offer上乙個示例**。我們就拿此分析一下。
其實對於過載賦值運算子,返回值是引用或者不是都行,**都可以執行,之所以用引用是為了提高**效率,為什麼引用就會提高**效率呢?
對於返回值是cmystring時(非引用)。返回時,會自動生成乙個臨時物件來儲存返回的這個內容,然後通過拷貝建構函式返回給呼叫這個函式的物件(*this)。但是當返回值是cmystring&時,將直接返回(意思就是在函式中實際操作的就是呼叫這個函式的物件,不存在臨時物件),就不存在這個臨時物件了。節省了空間時間。為此效率較高。
結論:返回值是型別的引用,只是為了我們節省效率的一種方式,還有,臨時物件具有常性(const)。
為了加深理解,看看下面例子---
按值返回有按值返回的好處
a fun()
按值返回的臨時變數,也並不一定馬上就會被析構
這樣a a;
a = fun();//fun返回乙個臨時物件,賦值給a後臨時物件將會析構
而這樣:
const a &b=fun();
fun返回值填入臨時變數後,將臨時變數的引用賦給變數b,由於有乙個引用指向了這個臨時變數,將不會再析構這個臨時變數,相當於延長了這個臨時變數的生命週期。
再來乙個指標的
const a *c=&fun();
fun返回值填入臨時變數後,將臨時變數的指標賦給變數c,但這時候與引用不同,臨時變數仍然會被析構,臨時變數的生命期結束,
b指向了乙個已經被析構的物件,危險。
不過好像對於新的c++標準,需要乙個const型別的引用才能指向臨時物件,這樣
const a &b=fun();
看到這裡或許讀者還有這個問題:
用引用時,為什麼臨時變數不會析構,用指標就會,這算不算指標跟引用的乙個區別呢,
c++ primer上有提到這個問題,試驗了一下也正確,算是規定吧,記住就行!!!
C語言賦值運算子的返回值
今天看c陷阱與缺陷,又看到了一處提到strcpy,下面有庫裡面的實現的 這是整理過的,不是原書的 char strcpy char dest,const char src while dest src 0 這一句讓我想了很久,以前一直認為賦值運算子返回的是是否複製成功,現在看起來它應該返回的是左值的...
運算子過載 函式返回值
舉例 include using namespace std class test test operator test temp1,test temp2 test operator test temp int main 結果1 vs2005執行結果 結果2 更改 過載函式為返回值,即test op...
c 賦值(賦值為函式返回值)語句的返回值問題
不知道為什麼,之前一直腦子裡有乙個誤解,賦值語句的返回值應該是1 成功賦值 或0 賦值失敗 今天其實在學linux的時候突然揣摩了一下 才發現這個問題 if dir opendir home ljz desktop null opendir返回空說明目錄開啟失敗 這句 裡面 null的判斷在 dir...