關於c++中函式返回引用的討論
從函式返回引用
確保其引用的物件在函式執行完後仍然存在。
引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。
永遠不要從函式中返回區域性變數的引用
c++中,返回引用是乙個比較晦澀的概念。在書中,對此僅僅做了乙個一般的介紹,並沒有展開。我覺得有必要對此進行一定的展開。
(1)首先,返回引用,要求在函式的引數中,包含有以
引用方式或
指標方式存在的,需要被返回的引數。比如:
int& abc(int a, int b, int c, int& result)
這種形式也可改寫為:
int& abc(int a, int b, int c, int *result)
但是,如下的形式是不可以的:
int& abc(int a, int b, int c)
(2)由於返回值直接指向了乙個生命期尚未結束的變數,因此,對於函式返回值(或者稱為函式結果)本身的任何操作,都在實際上,是對那個變數的操作,這就是引入
const型別的返回的意義。
當使用了
const關鍵字後,即意味著函式的返回值不能立即得到修改!如下**,將無法編譯通過,這就是因為返回值立即進行了++操作(相當於對變數z進行了++操作),而這對於該函式而言,是不允許的。如果去掉const,再行編譯,則可以獲得通過,並且列印形成
z = 7
的結果。
include
include
const int& abc(int a, int b, int c, int& result)
int main()
函式引用引數避免了過多的指標操作,對加強函式的可讀性很有幫助;另外,在傳入體積很大的型別的變數時,引用引數可以避免拷貝物件,加快程式執行效率。
函式支援引用型的返回值是為什麼呢?這個問題要一分為二:對於類型別的引用返回值,函式可以在使用過載運算子的串聯表示式中使用,而不用擔心構造多個物件。
#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)
由於賦值於b的型別是int, 編譯器不得不進行拷貝操作,然後再把這個值付給b。所以a和b的位址不同。
c++11裡徹底地避免了這個問題,有語法&&, 這樣的時候,即使是像上面一樣的語法也能起到避免複製的效果。
C 引用返回
還記得引用傳遞嗎?當時我們為了與按值傳參區分,我們把它叫做按址傳參。而今天我們將與引用返回區分。按值傳參和按址傳參可以參考部落格c 函式 二 的最後一部分。引用返回其實和引用傳遞一樣。引用傳遞使得傳入的變數和所對應引數的位址相同,而引用返回使得返回值的位址與傳給的變數的位址相同。我們先來看下面的 i...
C 返回物件和返回引用
最大的區別在於,返回物件的話會在記憶體中根據返回的型別開闢一塊區域,用返回的值對該記憶體進行初始化,如果是返回的物件,利用拷貝構造來初始化這個區域,但是這塊區域並沒有名字,就是說之後使用者沒辦法訪問到這個區域,也成為無名變數,它只能在接下來的 中進行一次性的用途,要不作為引數傳遞,或者將值列印,再之...
C 返回物件和返回引用
我們發現,在c 中,有些成員函式返回的是物件,而有些函式返回的又是引用。返回物件和返回引用的最主要的區別就是函式原型和函式頭。car run const car 返回物件 car run const car 返回引用 返回物件會涉及到生成返回物件的副本。因此,返回物件的時間成本包括了呼叫複製建構函式...