const引用返回值

2021-08-30 11:10:49 字數 3384 閱讀 8999

一、引用

引用是別名

必須在定義引用時進行初始化。初始化是指明引用指向哪個物件的唯一方法。

const 引用是指向 const 物件的引用:

const int ival = 1024;

const int &refval = ival; // ok: both reference and object are const

int &ref2 = ival; // error: non const reference to a const object

可以讀取但不能修改 refval ,因此,任何對 refval 的賦值都是不合法的。這個限制有其意義:不能直接對 ival 賦值,因此不能通過使用 refval 來修改ival。

同理,用 ival 初始化 ref2 也是不合法的:ref2 是普通的非 const 引用,因此可以用來修改 ref2 指向的物件的值。

通過 ref2 對 ival 賦值會導致修改const 物件的值。

為阻止這樣的修改,需要規定將普通的引用繫結到 const 物件是不合法的。

const 引用則可以繫結到不同但相關的型別的物件或繫結到右值。

int i = 42;

// legal for const references only

const int &r = 42;

const int &r2 = r + i;

i是int型別,r是const int&型別 

非 const 引用只能繫結到與該引用同型別的物件。

如果非 const 引用繫結到與該引用不同型別的物件:

double dval = 3.14;

const int &ri = dval;

編譯器會把這些**轉換成如以下形式的編碼:

int temp = dval; // create temporary int from the double

const int &ri = temp; // bind ri to that temporary

如果 ri 不是 const,那麼可以給 ri 賦一新值。這樣做不會修改 dval,

而是修改了 temp。

二、return

任何返回型別不是 void 的函式必須返回乙個值,而且這個返回值的型別必須和函式的返回型別相同,或者能隱式轉化為函式的返回型別。也就是說重要的是定義函式時返回值型別不是return的。

1、返回非引用型別

函式的返回值用於初始化在呼叫函式處建立的臨時物件。在求解表示式時,如果需要乙個地方儲存其運算結果,編譯器會建立乙個沒有命名的物件,這就是臨時物件。

int max (int a,int b)

int ret=max(1,8);

//該語句在編譯器內部:

temp =max(1,8);

ret=temp;

temp就是函式返回的建立的臨時物件,該物件對ret進行初始化

用函式返回值初始化臨時物件與用實參初始化形參的方法是一樣的。如果返回型別不是引用,在呼叫函式的地方會將函式返回值複製給臨時物件。當函式返回非引用型別時,其返回值既可以是區域性物件,也可以是求解表示式的結果。

例如,下面的程式提供了乙個計數器、乙個單詞 word 和單詞結束字串ending,當計數器的值大於 1 時,返回該單詞的複數版本:

// return plural version of word if ctr isn't 1

string make_plural(size_t ctr, const string &word,

const string &ending)

我們可以使用這樣的函式來輸出單詞的單數或複數形式。這個函式要麼返回其形參 word 的副本,要麼返回乙個未命名的臨時string 物件,這個臨時物件是由字串 word 和 ending 的相加而產生的。這兩種情況下,return 都在呼叫該函式的地方複製了返回的 string 物件。

2、返回的引用

當函式返回引用型別時,沒有複製返回值。相反,返回的是物件本身。

例如,考慮下面的函式,此函式返回兩個 string 型別形參中較短的那個字串的引用:

conststring&shorterstring(conststring&s1,conststring&s2)

形參和返回型別都是指向 const string 物件的引用,呼叫函式和返回結果時,都沒有複製這些 string 物件。

千萬不要返回區域性物件的引用

千萬不要返回指向區域性物件的指標

當函式執行完畢時,將釋放分配給區域性物件的儲存空間。此時,對區域性物件的引用就會指向不確定的記憶體。考慮下面的程式:

// disaster: function returns a reference to a local object

const string &manip(const string& s)

這個函式會在執行時出錯,因為它返回了區域性物件的引用。當函式執行完畢,字串 ret 占用的儲存空間被釋放,函式返回值指向了對於這個程式來說不再有效的記憶體空間。

函式的返回型別可以是大多數型別。特別地,函式也可以返回指標型別。和返回區域性物件的引用一樣,返回指向區域性物件的指標也是錯誤的。

一旦函式結束,區域性物件被釋放,返回的指標就變成了指向不再存在的物件的懸垂指標。

補充:懸垂指標指向曾經存放物件的記憶體,指標指向的物件已經不再存在了,但該指標仍存在。懸垂指標往往導致程式錯誤,而且很難檢測出來。

一旦刪除了指標所指向的物件,立即將指標置為 0,這樣就非常清楚地表明指標不再指向任何物件了。

3、引用返回左值

char&get_val(string&str,string::size_type ix)

intmain()

給函式返回值賦值可能讓人驚訝,由於函式返回的是乙個引用,因此這是正確的,該引用是被返回元素的同義詞。

如果不希望引用返回值被修改,返回值應該宣告為 const:

const char &get_val(...

c++primer4th第四版中文版

引用 引用型返回值

值形式的函式返回值通常都具有右值屬性,即在函式的呼叫者空間根據函式的返回型別建立乙個匿名物件,負責接收該函式的返回值 用於接收函式返回值的匿名物件和表示式的值類似,通常只具有語句級生命期且唯讀,即所謂將亡右值 如果函式返回的是乙個引用,那麼用於接收該返回值的就不再是乙個匿名的將亡右值物件,而是乙個引...

引用引數,引用返回值

函式形參詩引用,程式輸出如程式最後的注釋,表明引用s代表的是物件s2.函式中的引用 includeusing namespace std class sample sample sample a x a.x int getx 形參為引用 void disp sample s void disp sa...

c 引用返回值

函式返回值時,要生成乙個值的副本。而用引用返回值時,不生成值的副本。例如,下面的程式是有關引用返回的4種形式 ch9 6.cpp include float temp float fn1 float r float fn2 float r void main void main 見圖9 9說明。圖9...