C++函數的返回值——返回引用類型&非引用類型


(此文章轉載自cnblogs的fly1988happy博主)(若有粗體字為本人評論)

函數的返回主要分為以下幾種情況:

1、主函數main的返回值:

允許主函數main沒有返回值就可結束;可將主函數main返回的值視為狀態指示器,返回0表示程序運行成功,其他大部分返回值則表示失敗。

2、返回非引用類型:

  • 函數的返回值用於初始化在調用函數時創建的臨時對象(temporary object),如果返回類型不是引用,在調用函數的地方會將函數返回值復制給臨時對象。
  • 在求解表達式的時候,如果需要一個地方存儲其運算結果,編譯器會創建一個沒命名的對象,這就是臨時對象。C++程序員通常用temporary這個術語來代替temporary object。
  • 用函數返回值初始化臨時對象與用實參初始化形參的方法是一樣的。
  • 當函數返回非引用類型時,其返回值既可以是局部對象,也可以是求解表達式的結果。

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)

{
 return a + b + c;
}


4、返回const類型

由於返回值直接指向了一個生命期尚未結束的變量,因此,對於函數返回值(或者稱為函數結果)本身的任何操作,都在實際上,是對那個變量的操作,這就是引入const類型的返回的意義。當使用了const關鍵字后,即意味着函數的返回值不能立即得到修改!如下代碼,將無法編譯通過,這就是因為返回值立即進行了++操作(相當於對變量z進行了++操作),而這對於該函數而言,是不允許的。如果去掉const,再行編譯,則可以獲得通過,並且打印形成z = 7的結果。 

include <iostream>
include <cstdlib>
const int& abc(int a, int b, int c, int& result)
{
    result = a + b + c;
    return result;
}
int main()
{
   int a = 1; int b = 2; int c=3;
   int z;
   abc(a, b, c, z)++;  //wrong: returning a const reference
   cout << "z= " << z << endl;
   return 0;
}



5、例子

下面是一個段有錯誤的代碼,找出其中的錯誤。


錯誤代碼
#include <iostream>
using namespace std;
int val() 
{ 

     int i = 1; 
     return i; 
} 
int & ref() 
{ 
     int &i = j; 
     return i;
} 
  
int main() 
{ 

     int   vv = val(); 
     int & rv = val(); 
     int   vr = ref(); 
     int & rr = ref(); 
     return 0;
} 


正確代碼
#include <iostream>
using namespace std;
int j=3;//j是全局變量
int val() 
{ 

     int i = 1; 
     return i; 
} 
int & ref() 
{ 
//   int j=3;j不能是局部變量!
    int &i = j; 
      return i; //不能返回局部對象的引用
} 
  
int main() 
{ 

      int   vv = val(); 
      int   rv = val();//int   &rv = val()錯誤!val()返回的是一個int型的數,而給引用&rv 賦值的必須是一個同類型的變量。
    int   vr = ref(); 
      int & rr = ref(); 
      cout<<vv<<endl;
      cout<<rv<<endl;
      cout<<vr<<endl;
      cout<<rr<<endl;
      return 0;
} 




免責聲明!

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



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