從函式返回引用
確保其引用的物件在函式執行完後仍然存在。
引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。
永遠不要從函式中返回區域性變數的引用
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 指的是同...