無返回值函數(shù)
對(duì)于返回類型是void的函數(shù),return后不跟表達(dá)式诽表。最后的 return;
可以沒有而讓程序隱式執(zhí)行唉锌。在void函數(shù)中的return語(yǔ)句還有提前使函數(shù)退出的作用而不進(jìn)行接下來的計(jì)算,如定義一個(gè)swap函數(shù)在二者相同時(shí)不繼續(xù)運(yùn)算直接退出:
void swap(int& v1, int& v2){
if (v1==v2) return;
int tmp = v2;
v2 = v1;
v1 = tmp;
//可以不顯式添加return
}
有返回值函數(shù)
函數(shù)不是void類型竿奏,則每個(gè)void語(yǔ)句都必須返回一個(gè)值袄简,且這個(gè)值必須與函數(shù)返回類型相同或可以隱式轉(zhuǎn)換為函數(shù)的返回類型。同樣泛啸,程序執(zhí)行到return語(yǔ)句后會(huì)提前退出:
int foo(int a){
if (a) return 0;
return 1;
}
int main(){
int b = 2, c = 0;
cout<<foo(b)<<"\t"<<foo(c); // 0 1
}
值如何被返回
返回的方式和初始化一個(gè)變量或形參完全一致:返回的值用于初始化調(diào)用點(diǎn)的一個(gè)臨時(shí)量绿语,此臨時(shí)量即函數(shù)調(diào)用結(jié)果。
不要返回局部對(duì)象的引用或指針
否則當(dāng)結(jié)束運(yùn)行候址,函數(shù)的占用空間被完全釋放吕粹,引用或指針不再有效。
返回類類型的函數(shù)和調(diào)用運(yùn)算符
調(diào)用運(yùn)算符的優(yōu)先級(jí)和點(diǎn)運(yùn)算符或箭頭運(yùn)算符相同岗仑。因此可以使用函數(shù)調(diào)用的結(jié)果直接訪問結(jié)果對(duì)象的成員:
string a(string s1, string s2){return s1+s2;}
int main(){
string sa = "a", sb = "b";
cout<<a(sa,sb).size()<<endl;
}
引用返回左值
調(diào)用一個(gè)返回引用的函數(shù)匹耕,得到的結(jié)果是一個(gè)左值。因此可以為返回類型是非常量引用的函數(shù)的結(jié)果賦值:
//注意函數(shù)返回類型為char荠雕!
char get_var(string& str, string::size_type index){
return str[index];
}
int main(){
s = "hello";
get_val(s, 0) = 'H';
cout<<s; //Hello
}
列表初始化返回值
可以返回花括號(hào)包圍的值列表給一個(gè)臨時(shí)量稳其。此列表也用來對(duì)表示函數(shù)返回值的臨時(shí)量進(jìn)行初始化。若是空舞虱,則默認(rèn)初始化欢际。否則由函數(shù)返回類型決定返回值。
就如果返回的是內(nèi)置類型矾兜,則花括號(hào)列表只允許最多一個(gè)值且該值所占空間不應(yīng)大于目標(biāo)類型的空間损趋。若是類類型則由類本身定義,如vector的列表初始化椅寺。
主函數(shù)main的返回值
允許main函數(shù)沒有return語(yǔ)句而直接結(jié)束浑槽,編譯器會(huì)隱式地在最后插入 return 0
。
遞歸
無論直接或間接返帕,一個(gè)函數(shù)調(diào)用了自身則稱為遞歸函數(shù)桐玻。如下列階乘函數(shù):
int factorial(int val){
if (val) {
cout<<val; return factorial(val-1) * val;
}
//注意val-1不能是val--否則死循環(huán)
//若是--val不會(huì)報(bào)錯(cuò),但會(huì)多減一次荆萤,使最終返回值為 0
return 1;
}
返回?cái)?shù)組指針
數(shù)組不能拷貝镊靴,所以不能被返回铣卡。
返回?cái)?shù)組的指針可用類型別名簡(jiǎn)化:
typedef int arrT[10];
using arrT = int[10];//與上述等價(jià)且易懂
arrT* func(int i); //返回一個(gè)指向(含有10個(gè)整數(shù)的數(shù)組的)指針
聲明一個(gè)返回?cái)?shù)組指針的函數(shù)
函數(shù)形式如下:
type (*function(parameter_list))[dimension]
-
func(int i)
:表示調(diào)用func時(shí)需要int i作為實(shí)參 -
(*func(int i))
:表示可以對(duì)調(diào)用結(jié)果進(jìn)行解引用操作 -
(*func(int i))[10]
:表示解引用func的調(diào)用將得到一個(gè)大小10的數(shù)組 -
int (*func(int i))[10]
:表示數(shù)組中元素是int類型。
尾置返回類型trailing return type
任何函數(shù)定義都可以使用尾置返回偏竟,對(duì)于返回類型復(fù)雜的函數(shù)較為有效煮落,比如返回類型是數(shù)組的指針或者數(shù)組的一樣弄。尾置返回類型跟在形參列表后面以 ->
開頭:
auto func(int i) -> int(*)[10]
使用decltype
如果知道函數(shù)返回指針指向哪個(gè)數(shù)組踊谋,即可使用decltype聲明返回類型蝉仇。例如下列函數(shù)返回的指針根據(jù)參數(shù)不同而改變:
int odd[] = {1, 3, 5, 7, 9};
int even[] = {2, 4, 6, 8, 0};
decltype(odd) *arrPtr(int i){
return (i%2) ? &odd : &even;
}
int main(){
int i = 3;
cout<<*(*arrPtr(i)+1);
}
attrPtr使用decltype表示其返回類型是個(gè)指針,并且該指針?biāo)傅膶?duì)象與odd的類型一致殖蚕。因?yàn)閛dd是數(shù)組轿衔,arrPtr返回一個(gè)指向含有5個(gè)整數(shù)數(shù)組的指針。注意decltype的結(jié)果是個(gè)數(shù)組睦疫,要想表示arrPtr返回指針還必須在函數(shù)聲明時(shí)加一個(gè)*符號(hào)害驹。