C 函式返回值與引用

2021-09-10 02:15:26 字數 1203 閱讀 1787

對於函式的返回值,看似簡單,但並非如此,比如:

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這樣的呼叫,將通不過編譯。

posted @

2014-09-28 01:18

00000000o 閱讀(

...)

編輯收藏

C 函式返回值與引用

對於函式的返回值,看似簡單,但並非如此,比如 int func int a 該函式會返回乙個int型,如果進行乙個呼叫int result func 3 會發生什麼情況?首先,func將返回值複製到乙個匿名臨時變數中,在這裡假設該臨時變數為anony 其實是沒有名字的,這裡方便闡述 然後,再將ano...

c 函式返回值與引用

對於函式的返回值,看似簡單,但並非如此,比如 int func int a 該函式會返回乙個int型,如果進行乙個呼叫int result func 3 會發生什麼情況?首先,func將返回值複製到乙個匿名臨時變數中,在這裡假設該臨時變數為anony 其實是沒有名字的,這裡方便闡述 然後,再將ano...

c 引用返回值

函式返回值時,要生成乙個值的副本。而用引用返回值時,不生成值的副本。例如,下面的程式是有關引用返回的4種形式 ch9 6.cpp include float temp float fn1 float r float fn2 float r void main void main 見圖9 9說明。圖9...