C 返回引用

2021-06-03 08:08:29 字數 1594 閱讀 6832

關於c++中函式返回引用的討論

從函式返回引用

確保其引用的物件在函式執行完後仍然存在。

引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。

永遠不要從函式中返回區域性變數的引用

c++中,返回引用是乙個比較晦澀的概念。在書中,對此僅僅做了乙個一般的介紹,並沒有展開。我覺得有必要對此進行一定的展開。

(1)首先,返回引用,要求在函式的引數中,包含有以

引用方式或

指標方式存在的,需要被返回的引數。比如:

int& abc(int a, int b, int c, int& result)

這種形式也可改寫為:

int& abc(int a, int b, int c, int *result)

但是,如下的形式是不可以的:

int& abc(int a, int b, int c)

(2)由於返回值直接指向了乙個生命期尚未結束的變數,因此,對於函式返回值(或者稱為函式結果)本身的任何操作,都在實際上,是對那個變數的操作,這就是引入

const型別的返回的意義。

當使用了

const關鍵字後,即意味著函式的返回值不能立即得到修改!如下**,將無法編譯通過,這就是因為返回值立即進行了++操作(相當於對變數z進行了++操作),而這對於該函式而言,是不允許的。如果去掉const,再行編譯,則可以獲得通過,並且列印形成

z = 7

的結果。

include 

include

const int& abc(int a, int b, int c, int& result)

int main()

函式引用引數避免了過多的指標操作,對加強函式的可讀性很有幫助;另外,在傳入體積很大的型別的變數時,引用引數可以避免拷貝物件,加快程式執行效率。

函式支援引用型的返回值是為什麼呢?這個問題要一分為二:對於類型別的引用返回值,函式可以在使用過載運算子的串聯表示式中使用,而不用擔心構造多個物件。

#include

#include

using namespace std;

class rec

執行結果:

[cinson@localhost test]$ ./a.out      

&obj = 0xbf90e338

ptr = 0xbf90e338

&ano = 0xbf90e330

可見,紅色**只會生成乙個物件,綠色**部分需要呼叫拷貝建構函式。因為fucrec傳入引用引數,返回引用物件。如果返回的不是引用物件,那麼在

語句rec *ptr = &( funrec(obj) );

編譯不過。

對於int這樣的型別,原理也是一模一樣。

int&func(

int& a) 

intmain(

intargc , 

char

* args) 

由於賦值於b的型別是int, 編譯器不得不進行拷貝操作,然後再把這個值付給b。所以a和b的位址不同。

c++11裡徹底地避免了這個問題,有語法&&, 這樣的時候,即使是像上面一樣的語法也能起到避免複製的效果。

C 引用返回

還記得引用傳遞嗎?當時我們為了與按值傳參區分,我們把它叫做按址傳參。而今天我們將與引用返回區分。按值傳參和按址傳參可以參考部落格c 函式 二 的最後一部分。引用返回其實和引用傳遞一樣。引用傳遞使得傳入的變數和所對應引數的位址相同,而引用返回使得返回值的位址與傳給的變數的位址相同。我們先來看下面的 i...

C 返回物件和返回引用

最大的區別在於,返回物件的話會在記憶體中根據返回的型別開闢一塊區域,用返回的值對該記憶體進行初始化,如果是返回的物件,利用拷貝構造來初始化這個區域,但是這塊區域並沒有名字,就是說之後使用者沒辦法訪問到這個區域,也成為無名變數,它只能在接下來的 中進行一次性的用途,要不作為引數傳遞,或者將值列印,再之...

C 返回物件和返回引用

我們發現,在c 中,有些成員函式返回的是物件,而有些函式返回的又是引用。返回物件和返回引用的最主要的區別就是函式原型和函式頭。car run const car 返回物件 car run const car 返回引用 返回物件會涉及到生成返回物件的副本。因此,返回物件的時間成本包括了呼叫複製建構函式...