非常量引用的初始值必須為左值
一。 c++例項
*****
*****
*****
*****
*****
*****
*****
*****
*****
***b show()
*****
*****
*****
*****
*****
*****
*****
*****
*****
****
void test()
*****
*****
*****
*****
*****
*****
*****
*****
*****
****
二。 c例項以c++
的某個自定義類為例:
當show返回值是自定義型別後,呼叫該函式,會自動呼叫一次拷貝建構函式生成乙個臨時變數,即返回值
是乙個臨時變數
*****
*****
*****
*****
*****
*****
*****
*****
*****
****
typedef struct big_thing
big_thing;
*****
*****
*****
*****
*****
*****
*****
*****
*****
****
big_thing return_test()
int main()
*****
*****
*****
*****
*****
*****
*****
*****
*****
****
出自《程式設計師的自我修養-鏈結、裝載與庫》p299
eax是函式傳遞返回值的乙個通道。
1.對於小於4個位元組的資料函式將返回值儲存在eax中。
2.5~8個位元組物件的情況呼叫慣例都是採用eax和edx的聯合返回方式進行。
3.大於8個位元組的返回型別,用上面**測試:
以c語言的一段**為例:
1.首先main函式在棧額外開闢了一片空間,並將這塊空間的一部分作為傳遞返回值的臨時物件,這裡稱為temp
2.將temp物件的位址作為隱藏引數傳遞個return_test函式
3.return_test 函式將資料拷貝給temp物件,並將temp物件的位址用eax傳出。
4.return_test返回以後,mian函式將eax 指向的temp物件的內容拷貝給n。
簡單就是一句話:當返回值非引用的時候,只要有函式返回值,那麼該返回值就是乙個臨時變數
三:臨時變數能不能被引用:
四: 最後說一下我出現的問題:class a;
a func();
const a &ref=func();
這種情況下,ref 會一直有效到ref消失
函式是值返回,建立了乙個臨時變數
a &ref=func();
若沒有加const,該引用也不能成立
解釋: : 臨時的中間變數都是const,所有沒有const的引用會失敗。
左值,右值:*****
*****
*****
*****
*****
*****
*****
*****
*****
****
const node* getroot()
*****
*****
*****
*****
*****
*****
*****
*****
*****
****
沒問題:
void test(binarytree t1, binarytree t2)
*****
*****
*****
*****
*****
*****
*****
*****
*****
****
有問題:
void test(binarytree t1, binarytree t2)
非常量引用的初始值必須為左值:
左值和右值都是針對表示式而言的,左值是指表示式結束後依然存在的持久物件,右值是指表示式結束時就不再存解釋:
兩個對比一下,你會發現,有問題的僅僅少了個const
1. 聯想前面的例子:返回乙個普通變數和返回乙個指標變數,都是對這個變數的乙份臨時拷貝進行返回。
2. 函式的返回值雖然是乙個指標,但是返回的這個指標本身就是乙個原指
針的乙份拷貝,是乙個臨時變數,具有常屬性
3. 當你寫乙個函式返回值為任意型別的指標的時候,取函式的返回值位址(不能先定義變數 = 函式
,再給變數取位址,應該直接對所呼叫的函式取位址),你會發現,取位址錯誤,也是因為臨時變數。
4.返回型別是內建型別的時候,函式不能直接取位址,而若是自定義型別的話,函式就可以直接取位址,與編譯器處理有關
參考文章:
函式返回值為指標型別
char getstring void void main void 在函式getstring 中定義的變數p屬於local 區域性變數 當函式結束時自動消失,所以在返回時,根本就得不到p所指的內容。解決辦法有以下幾種 可能還有很多方法,不過這裡只是最常見的幾中,也是最能體表現程式中記憶體使用的情況...
函式返回值為指標型別的總結
參考部落格 char getstring void void main void void main 3 可以定義為靜態型別,static char p hello world 用static 宣告乙個指標可以,但也不太好,因為如果你多次呼叫這個函式返回多個指標,但這幾個指標實際上指向同一塊位址,改...
返回值為函式指標的示例
include include double getmin double dbdata,int isize 求最小值 return dbmin double getmax double dbdata,int isize 求最大值 double dbmax int i assert isize 0 d...