函式返回值分為:值,引用,指標三種。引用是c沒有而c++有的,並且因為引用是左值實現了運算子連續運算的基礎,而值和引用都不可以。下面我們就來看一下這三種返回方式的各自的特點:
1、返回值
[cpp]view plain
copy
inttest1()
返回值是最簡單有效的方式,他的操作主要在棧上,根據函式棧的特性區域性變數a會在函式結束時被刪除,為了返回a的值,需要產生a的複製。如果a原子型別這當然也無所謂,但是如果a是大的對像,那麼對a的複製將會產生比較嚴重的資源和效能消耗。注意函式返回值本身因為沒有名稱或引用是右值,是不能直接操作的。
2、返回指標
[cpp]view plain
copy
int* test2()
返回指標是在c中除了返回值以外的唯一方式,根據函式棧的特性也會產生複製,但是這個複製只是4(8)位元組的指標,對於返回大型對像來說確實能夠減少不少的資源消耗。但是返回指標資源的清理工作交給了呼叫者,這某種意義上違反了誰申請誰銷毀的原則。指標也是右值同樣無法操作。
3、返回引用
[cpp]view plain
copy
int& test2()
引用是c++中新新增的概念,所以返回引用也是c++中相對於c來說所沒有的。引用是值的別名,和指標一樣不存在對大對像本身的複製,只是引用別名的複製。引用是左值,返回引用可以直接操作,也就可以進行連續賦值,最經典的示例是拷貝建構函式和運算子過載一般返回引用。
[cpp]view plain
copy
test2()+=1;
但是,返回引用會帶來乙個問題,那就是返回區域性變數記憶體空間,會產生異常,也就是說區域性變數是不能作為引用返回的。區域性指標可以作為引用返回但是和返回指標一樣需要呼叫者自己去清理記憶體。
左值 右值 左值引用 右值引用
2015 06 01 15 07 404人閱讀收藏 舉報 c 11 5 一 c 中的左值和右值 誤區 左值位於等號左邊,右值位於等號右邊。c 11中的定義 左值表示式表示的是乙個物件的身份 在記憶體中的位置 而右值表示式表示的是物件的值 內容 左值和右值都是針對表示式而言的,左值是持久的,右值是短暫...
左值 左值引用 右值 右值引用
1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...
左值 左值引用 右值 右值引用
1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...