C++中函數的返回值


 

原文

[ 函數的返回值用於初始化在調用函數處創建的臨時對象。在求解表達式時,如果需要一個地方儲存其運算結果,編譯器會創建一個沒有命名的對象,這就是 臨時對象。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

 

參考:

  C++ const引用詳解

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM