c++函数返回值与引用
對于函數(shù)的返回值,看似簡單,但并非如此,比如:
int func(int a);該函數(shù)會返回一個(gè)int型,如果進(jìn)行一個(gè)調(diào)用int result=func(3);會發(fā)生什么情況?
首先,func將返回值復(fù)制到一個(gè)匿名臨時(shí)變量中,在這里假設(shè)該臨時(shí)變量為anony(其實(shí)是沒有名字的,這里方便闡述);然后,再將anony的值復(fù)制到result,可以看出,這里是進(jìn)行了兩次復(fù)制的。而并非一次復(fù)制。
?
對于返回引用的函數(shù):
int & func(int &a);假設(shè)該函數(shù)傳入一個(gè)int的引用,然后再func中修改它,再返回其引用,如果調(diào)用int reslut=func(b);會發(fā)生如下情況:
返回的是b的引用,因此相當(dāng)于直接將b的值復(fù)制給了result。這里就只有一次復(fù)制(少了臨時(shí)變量的復(fù)制,當(dāng)然也創(chuàng)建了一個(gè)臨時(shí)變量,只是該臨時(shí)變量是b的一個(gè)引用)。
需要特別注意的是,按很多人的理解,這里返回的是一個(gè)引用,因此result就是b的引用,其實(shí)并非如此,這里返回引用只是減少了一次臨時(shí)變量值的復(fù)制。如果真的要讓result能夠引用b,可以這樣做:int &result = func(b);
注:返回普通變量的引用看不出效率的差異,但是返回比較大的類或者結(jié)構(gòu)體的時(shí)候效率差異比較明顯。
?
那如果是這樣申明函數(shù)int func(int a);注意,這里返回的不是引用。然后int &result=func(a);會發(fā)生什么情況呢?
如果是這樣,編譯器將報(bào)錯:不能用一個(gè)臨時(shí)變量來初始化一個(gè)非常量的引用變量。
要消除這種報(bào)錯,可以這樣寫const int &result=func(a);這樣雖然返回的不是引用,但是由于最后賦給的是一個(gè)引用變量,因此在返回過程中也只有一次復(fù)制過程。但是這樣的result是不能修改其引用的內(nèi)容的。
?
還有一種看似更為詭異但卻十分合理的情況:
int &func (int &a);同樣假設(shè)該函數(shù)傳入一個(gè)int的引用,在func中修改它,然后返回其引用。然后這樣調(diào)用func(b)=3;這樣的后果是,傳入的b的值變?yōu)?。原因是func返回了一個(gè)b的引用,然后再將該引用賦為3,因此b的值也變成了3。
如果要禁止這種情況的發(fā)送,可以這樣聲明函數(shù):const int &func(int &a);這樣返回的是一個(gè)const引用,它不允許使用該引用修改其指向的值。因此如果有func(b)=3這樣的調(diào)用,將通不過編譯。
總結(jié)
以上是生活随笔為你收集整理的c++函数返回值与引用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 利用boost 实现文件操作
- 下一篇: C++如何监听http请求