引用的概念是C++中的,C中不存在引用。
問題1:返回引用類型和非引用類型的區別。
返回非引用類型:函數的返回值用於初始化在調用函數時創建的臨時對象。用函數返回值初始化臨時對象與用實參初始化形參的方法是一樣 的。如果返回類型不是引用,在調用函數的地方會將函數返回值複製給臨時對象。且其返回值既可以是局部對象,也可以是求解表達式的結果。
返回引用類型:當函數返回引用類型時,沒有複製返回值。相反,返回的是對象本身。所以,其效率更高。
問題2:什麼時候返回引用是正確的?而什麼時候返回const引用是正確的?
返回指向函數調用前就已經存在的對象的引用是正確的。當不希望返回的對象被修改時,返回const引用是正確的。
問題3:什麼情況下返回引用纔是正確的?*********************請直接忽略問題3,這次回來看後,發現觀點欠論據*********************
返回引用,要求在函數的參數中,包含有以引用方式或指針方式存在的,需要被返回的參數。比如:
int& abc(int a, int b, int c, int& result){
result = a + b + c;
return result;
}
或者:
int& abc(int a, int b, int c, int *result){
*result = a + b + c;
return *result;
}
這種形式是錯誤的:(設計思想錯誤,can compile and run)int& abc(int a, int b, int c){
return a + b + c;
}
注意4:
- 返回的引用類型是左值。
- 千萬不要返回局部對象的引用!千萬不要返回指向局部對象的指針!函數執行完畢時,將釋放分配給局部對象的存儲空間。此時對局部對象的引用就會指向不確定的內存!返回指向局部對象的指針也是一樣的,當函數結束時,局部對象被釋放,返回的指針就變成了不再存在的對象的懸垂指針。
關於臨時對象5:返回非引用類型,存在臨時對象這個概念。
- 函數的返回值用於初始化在調用函數時創建的臨時對象(temporary object),如果返回類型不是引用,在調用函數的地方會將函數返回值複製給臨時對象。
- 在求解表達式的時候,如果需要一個地方存儲其運算結果,編譯器會創建一個沒命名的對象,這就是臨時對象。C++程序員通常用temporary這個術語來代替temporary object。用函數返回值初始化臨時對象與用實參初始化形參的方法是一樣的。
- 當函數返回非引用類型時,其返回值既可以是局部對象,也可以是求解表達式的結果。
題外話6:
main函數允許沒有返回值就可結束,編譯器會自動爲其默認返回0。將主函數main返回的值視爲狀態指示器,返回0表示程序運行成功,其他大部分返回值則表示失敗。
代碼分析7:(注意看註釋)
#include <iostream>
using namespace std;
int val()
{
int i = 1 ;
return i ;
}
int& ref()
{
int j = 3 ;
int &i = j ; // comment it will also compile.
return j ; // 不能返回局部對象的引用,可以將int j = 3 ;放在全局作用域。
// 但是編譯器不會報錯,只是設計思想有問題,請注意main函數中Attention 1和Attention 2的結果。
}
int main()
{
int vv = val();
//Sconst int& rv = val(); // 編譯器報錯,error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
// const int& rv = val(); can compile
int vr = ref() ; // Attention 1,編譯器不會報錯。
int& rr = ref() ; // Attention 2
cout << vv << endl ;
//cout << rv << endl ;
cout << vr << endl ;
cout << rr << endl ;
return 0;
}
運行結果1:
運行結果2:
參考博文:http://blog.csdn.net/keyouan2008/article/details/5741917
http://chinaxxren.iteye.com/blog/1547449
相關博文:關於C++引用的分析