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