C 中函式返回引用

2021-09-26 12:10:55 字數 1484 閱讀 8441

下面兩個**是在類中的成員函式,而m_data_變數為類的私有成員變數。

int&at

()

intat(

)

上面兩個函式,第乙個返回值是int的引用int&,第二個返回值是int,但是二者有什麼區別?

返回值為引用型(int& )的時候,返回的是位址,因為這裡用的是 int& a=a.at(); ,所以a和m_data_指的是同一塊位址。

返回值不是引用型(int)的時候,返回的是乙個數值。這個時候就很有意思了,編譯器是先將這個數值放入乙個記憶體中,再把這個位址付給a,此時的a代表的位址和m_data_代表的位址不一樣。

綜上兩點可以看出,當返回的值是引用型時,會返回該變數的位址。當返回的值不是引用型時,編譯器會專門給返回值分配出一塊記憶體的

int&at

()int a=at(

);

上面**的執行過程為:

函式返回類物件中的成員變數m_data的位址。(這裡會不會造成私有變數的洩露?)

注意:

函式返回引用,要慎重,一定要保證函式結束後,返回的引用是有效的

一般用作類物件的返回值,可以減少臨時物件的申請、構造等操作,節省空間時間,比如

string &

operator=(

const string &

)

看下面的函式,返回的是t而不是&t,所以一定會有臨時變數產生。

t function1()

t x=

function1()

;

這裡的過程是:

建立命名物件t

拷貝構造乙個無名的臨時物件,並返回這個臨時物件

由臨時物件拷貝構造物件x

t x=function1();這句語句結束時,析構臨時物件

這裡一共生成了3個物件,乙個命名物件t,乙個臨時物件作為返回值,乙個命名物件x。

下面的函式稍微複雜一定,它沒有先定義乙個中間變數t,看起來似乎是直接返回了乙個臨時變數。但實際上,如果不經過c++的優化,那麼它並沒有提高效率,因為它還是建立了3個物件。

t function2()

t x=

function2()

;

這裡的過程是:

建立乙個無名物件

由無名物件拷貝構造乙個無名的臨時物件

析構無名物件,返回臨時物件

由臨時物件拷貝構造物件x

t x=function2()語句結束時,析構臨時物件。

這裡一共生成了3個物件,其中有2個物件都是馬上被析構掉的,不能被後面的**使用。既然是這樣,那麼就會有優化的餘地,可以嘗試著不要前面的兩個臨時變數。c++確實會做這樣的優化,優化後的c++會避免匿名物件和臨時物件這兩個物件的生成,而直接生成x,這樣就減少了兩次物件生成-**的消耗,提高了程式效能。

c 函式返回引用

1 什麼是引用?引用就是變數的別名,操作乙個變數的引用也就相當於操作變數本身,這一點跟指標很類似,但是操作引用不用像操作指標一樣,利用取位址符號,很不方便。而操作引用的話,則跟操作普通變數一樣,所以c 之中更加鼓勵使用引用。2 c 函式為什麼要使用引用?c語言之中大量利用指標作為形參或者函式返回值,...

C 函式返回引用

首先需要明白 c 函式為什麼要返回引用?答 這樣就不用返回結果的副本。因為返回副本需要做賦值拷貝函式,浪費時間。這時候,實際上,返回是結果的副本,而不是結果本身。如果要返回本身,就返回引用就ok了。例1 const string manip2 const string s 此時,返回的不是ret本身...

c 函式返回引用

一,c 函式的返回分為以下幾種情況 1 主函式main的返回值 這裡提及一點,返回0表示程式執行成功。2 返回非引用型別 函式的返回值用於初始化在跳用函式出建立的臨時物件。用函式返回值初始化臨時物件與用實參初始化形參的方法是一樣 的。如果返回型別不是引用,在呼叫函式的地方會將函式返回值複製給臨時物件...