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

2021-05-22 16:09:39 字數 2356 閱讀 5597

從函式返回引用

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

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

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

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

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

引用 方式或

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

int& abc(inta,intb,intc,int& result)

這種形式也可改寫為:

int& abc(inta,intb,intc,int*result)

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

int& abc(inta,intb,intc)

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

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

include

include

const int& abc(inta,intb,intc,int& result)

intmain()

標籤:

眾所周知,c++函式可以傳入引用引數和返回引用。

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

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

#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)

執行結果:

&a=0x0012ff7c,&b=0012ff78

這裡可以看到,返回變數的位址和傳入位址是不同的。變數b是main函式中自己的棧中生成的。

這一點從彙編**片段中可以看得更清楚:

; line 38

lea   eax, dword ptr _a$[ebp]

push   eax

call   ?func@@yaaahaah@z       ; func

add   esp, 4

mov   ecx, dword ptr [eax]

mov  

dword ptr _b$[ebp], ecx

int& c=func(a)

那麼c就是指向a,

a變化那麼c也跟著變化,

在上面b的情況,

是重新分配了乙個空間,

因此不會同步變化.

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

從函式 返回引用 確保其引用的物件在函式執行完後仍然存在。引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。永遠不要從函式中返回區域性變數的引用.1 首先,返回引用,要求在函式的引數中,包含有以 引用方式或 指標方式存在的,需要被返回的引數。比如 in...

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

從函式返回引用 確保其引用的物件在函式執行完後仍然存在。引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。永遠不要從函式中返回區域性變數的引用 c 中,返回引用是乙個比較晦澀的概念。在書中,對此僅僅做了乙個一般的介紹,並沒有展開。我覺得有必要對此進行一...

C 中函式返回引用

下面兩個 是在類中的成員函式,而m data 變數為類的私有成員變數。int at intat 上面兩個函式,第乙個返回值是int的引用int 第二個返回值是int,但是二者有什麼區別?返回值為引用型 int 的時候,返回的是位址,因為這裡用的是 int a a.at 所以a和m data 指的是同...