下面兩個**是在類中的成員函式,而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 返回非引用型別 函式的返回值用於初始化在跳用函式出建立的臨時物件。用函式返回值初始化臨時物件與用實參初始化形參的方法是一樣 的。如果返回型別不是引用,在呼叫函式的地方會將函式返回值複製給臨時物件...