如何理解引用作為函式的返回值?

2021-10-24 17:13:19 字數 2499 閱讀 1030

#include

using

namespace std;

float temp;

float

fn1(

float r)

float

&fn2

(float r)

intmain()

case 1:用返回值方式呼叫函式:

返回全域性變數temp的值時,c++會在記憶體中建立臨時變數並將temp的值拷貝給該臨時變數。當返回到主函式main後,賦值語句a=fn1(5.0)會把臨時變數的值再拷貝給變數a

case 2:用函式的返回值初始化引用的方式呼叫函式

這種情況下,函式fn1()是以值方式返回到,返回時,首先拷貝temp的值給臨時變數。返回到主函式後,用臨時變數來初始化引用變數b,使得b成為該臨時變數到的別名。由於臨時變數的作用域短暫(在c++標準中,臨時變數或物件的生命週期在乙個完整的語句表示式結束後便宣告結束,也就是在語句float &b=fn1(5.0);之後) ,所以b面臨無效的危險,很有可能以後的值是個無法確定的值。

case 3:用返回引用的方式呼叫函式:

這種情況下,函式fn2()的返回值不產生副本,而是直接將變數temp返回給主函式,即主函式的賦值語句中的左值是直接從變數temp中拷貝而來(也就是說c只是變數temp的乙個拷貝而非別名) ,這樣就避免了臨時變數的產生。尤其當變數temp是乙個使用者自定義的類的物件時,這樣還避免了呼叫類中的拷貝建構函式在記憶體中建立臨時物件的過程,提高了程式的時間和空間的使用效率

case 4:用函式返回的引用作為新引用的初始化值的方式來呼叫函式:

這種情況下,函式fn2()的返回值不產生副本,而是直接將變數temp返回給主函式。在主函式中,乙個引用宣告d用該返回值初始化,也就是說此時d成為變數temp的別名。由於temp是全域性變數,所以在d的有效期內temp始終保持有效,故這種做法是安全的。

下面看乙個賦值運算子過載的例子:(連續賦值,常規的情況(a = b = c))

#include

using

namespace std;

class

string

/*copy construct*/

string

(const string& other)

~string()

};string::

string

(const

char

* s)

//建構函式定義

string string::

operator=(

const string &other)

//運算子過載

intmain()

1.直接執行結果:

2.下面是返回引用的情況(string& operator = (const string& str)),直接貼執行結果

當運算子過載返回的是物件時,會在連續賦值運算過程的返回途中,呼叫兩次拷貝建構函式和析構函式(因為return的是個新的物件)

如果採用string& operator = (const string& str)這樣就不會有多餘的呼叫(因為這裡直接return乙個已經存在的物件的引用)

上面的栗子也說明一點:析構函式的呼叫是在變數作用域結束的時候(以及程式執行結束的時候)如果採用return物件,那麼第二次賦值運算呼叫的情況就是:將乙個新的string物件(returnstringobj)傳遞到operator = (const string& str)的引數中去 相當於

const string&str = returnstringobj;

如果採用return物件引用,那麼第二次賦值運算的情況就是:將乙個已經存在的string物件的引用((其實就是str1))傳遞給operator = (const string& str)的引數中去

const string&str = returnreference; //(string& returnreference =

str1;)

「引用作為函式引數」與 「引用作為函式返回值」

一 引用作為函式引數 作為函式引數時引用有兩種原因 1 在函式內部會對此引數進行修改 2 提高函式呼叫和執行效率。關於第一點,都知道 c 裡提到函式就會提到形參和實參。如果函式的引數實質就是形參,不過這個形參的作用域只是在函式體內部,也就是說實參和形參是兩個不同的東西,要想形參代替實參,肯定有乙個值...

將引用作為函式返回值

要以引用返回函式值,則函式定義時必須遵循以下格式 型別識別符號 函式名 形參列表及型別說明 可見,以引用返回函式值,定義函式時需要在函式名前加 引用作為函式的返回值時,函式的返回值可以理解為函式返回了乙個變數 事實上,函式返回引用時,它返回的是乙個指向返回值的隱式指標 因此,值為引用的函式可以用作賦...

引用作為函式引數返回值

說明 1 以引用返回函式值,定義函式時需要在函式名前加 2 用引用返回乙個函式值的最大好處是,在記憶體中不產生被返回值的副本。例如 include float temp 定義全域性變數temp float fn1 float r 宣告函式fn1 float fn2 float r 宣告函式fn2 f...