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

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

 

函數的返回主要分爲如下幾種狀況:html

一、主函數main的返回值:ios

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

二、返回非引用類型:app

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

三、返回引用類型:ide

  • 當函數返回引用類型時,沒有複製返回值,相反,返回的是對象自己。
  • 千萬不要返回局部對象的引用!千萬不要返回指向局部對象的指針!

當函數執行完畢時,將釋放分配給局部對象的存儲空間。此時對局部對象的引用就會指向不肯定的內存!返回指向局部對象的指針也是同樣的,當函數結束時,局部對象被釋放,返回的指針就變成了再也不存在的對象的懸垂指針。函數

  • 返回引用時,要求在函數的參數中,包含有以引用方式或指針方式存在的,須要被返回的參數。
正確的方式
錯誤的方式

四、返回const類型post

因爲返回值直接指向了一個生命期還沒有結束的變量,所以,對於函數返回值(或者稱爲函數結果)自己的任何操做,都在實際上,是對那個變量的操做,這就是引入const類型的返回的意義。當使用了const關鍵字後,即意味着函數的返回值不能當即獲得修改!以下代碼,將沒法編譯經過,這就是由於返回值當即進行了++操做(至關於對變量z進行了++操做),而這對於該函數而言,是不容許的。若是去掉const,再行編譯,則能夠得到經過,而且打印造成z = 7的結果。 url

複製代碼
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;
}
複製代碼

五、例子spa

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

複製代碼
#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;
}
複製代碼
相關文章
相關標籤/搜索