c++ 函数返回引用
一,c++函數(shù)的返回分為以下幾種情況
?
1)主函數(shù)main的返回值:這里提及一點,返回0表示程序運行成功。
2)返回非引用類型:函數(shù)的返回值用于初始化在跳用函數(shù)出創(chuàng)建的臨時對象。用函數(shù)返回值初始化臨時對象與用實參初始化形參的方法是一樣?的。如果返回類型不是引用,在調(diào)用函數(shù)的地方會將函數(shù)返回值復(fù)制給臨時對象。且其返回值既可以是局部對象,也可以是求解表達式的結(jié)果。
3)返回引用:當(dāng)函數(shù)返回引用類型時,沒有復(fù)制返回值。相反,返回的是對象本身。
?
?
二,函數(shù)返回引用
?
1,當(dāng)函數(shù)返回引用類型時,沒有復(fù)制返回值。相反,返回的是對象本身。先看兩示例,示例1如下:
?
const string &shorterString(const string &s1,const string &s2)
{
return s1.size < s2.size ? s1:s2;
}
?
示例2:
?
[cpp] view plaincopy
?
?? ?形參和返回類型都是指向const string對象的引用,調(diào)用函數(shù)和返回結(jié)果時,都沒有復(fù)制這些string對象。
?
2,返回引用,要求在函數(shù)的參數(shù)中,包含有以引用方式或指針方式存在的,需要被返回的參數(shù)。比如:
?
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;
}
?? ? 但是,如下的形式是不可以的:
int& abc(int?a,?int?b,?int?c){
? ?return?a + b + c;
}
?
3,千萬不要返回局部對象的引用。當(dāng)函數(shù)執(zhí)行完畢時,將釋放分配給局部對象的存儲空間。此時,對局部對象的引用就會指向不確定的內(nèi)存。如:
const string &manip(const string &s)
{
string ret =s;
return ret; ?//wrong:returning reference to a local object
}
?
4,引用返回左值。返回引用的函數(shù)返回一個左值。因此這樣的函數(shù)可用于任何要求使用左值的地方。示例見:c++ primer p215
?
5,由于返回值直接指向了一個生命期尚未結(jié)束的變量,因此,對于函數(shù)返回值(或者稱為函數(shù)結(jié)果)本身的任何操作,都在實際上,是對那個變量的操作,這就是引入const類型的返回的意義。當(dāng)使用了const關(guān)鍵字后,即意味著函數(shù)的返回值不能立即得到修改!如下代碼,將無法編譯通過,這就是因為返回值立即進行了++操作(相當(dāng)于對變量z進行了++操作),而這對于該函數(shù)而言,是不允許的。如果去掉const,再行編譯,則可以獲得通過,并且打印形成z = 7的結(jié)果。
?
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;
? SYSTEM("PAUSE");
?? return?0;
}
?
三,思考:
?? ?
1,什么時候返回引用是正確的?而什么時候返回const引用是正確的??
?
?? ?返回指向函數(shù)調(diào)用前就已經(jīng)存在的對象的引用是正確的。當(dāng)不希望返回的對象被修改時,返回const引用是正確的。
總結(jié)
以上是生活随笔為你收集整理的c++ 函数返回引用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache在windows下的安装配置
- 下一篇: c++ 利用boost 实现文件操作