原文
[ 函數的返回值用於初始化在調用函數處創建的臨時對象。在求解表達式時,如果需要一個地方儲存其運算結果,編譯器會創建一個沒有命名的對象,這就是 臨時對象。temporary object ]
--就是說,當你需要使用函數的返回值時,編譯器會創建一個 臨時對象。
--只有非引用返回才會創建臨時對象!!!
C++中函數的返回值有三種類型:void、非引用、引用。
-- 非引用,返回的是實參對象或者局部對象的副本!
-- 引用,返回的是引用,而非副本。
上面這么說很教科書,需要和實際代碼聯系起來理解。
問題
怎么驗證非引用返回的就是副本?又怎么驗證引用返回的就是引用?
在這里不得不說指針是個好東西,完全可以通過輸出對象的地址(指針)來判斷是否副本。
如下面代碼部分,定義了三個函數,分別返回非引用、引用(實參)、引用(局部對象)。
代碼
#include <iostream> using namespace std; //返回非引用 int myno(int &v1){ return v1; } //返回引用 int &myno2(int &v1){ return v1; } //返回局部引用 Never ever ever do this int &myno3(int &v1){ int v2=v1; //副本 return v2;//Don't do this } //判斷傳入的和返回的是否同一個 int main(){ int v1=1; cout<<&v1<<endl; const int &no1 = myno(v1); //為毛必須要const? cout<<&no1<<endl; //和&v1不同,因為返回的是副本 int &no2=myno2(v1); cout<<&no2<<endl; // 和&v1相同 int &no3=myno3(v1); cout<<&no3<<endl;//被釋放的內存 cout<<no3<<endl;//無效值 return 0; }
由此可驗證,非引用返回的的確是副本,而引用則返回引用。
只是,務必注意,不要返回局部對象的引用!
為什么使用 非引用返回 來賦值時需要const?
原因:不允許非const引用指向需要臨時對象(見本文開頭部分)的對象或值,即,編譯器產生臨時變量的時候引用必須為const!!!!切記!!
就是說,返回引用時,沒有臨時對象?
20160617修改:c++11已經去掉了該限制(引用必須const的限制)。
--補充:使用字面值常量初始化引用時,也會創建臨時對象,所以也必須const。
參考: