函數返回值:引用類型和非引用類型

        引用的概念是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++引用的分析


發佈了130 篇原創文章 · 獲贊 13 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章