C C 引用作為函式的返回值

2021-09-11 07:34:21 字數 2562 閱讀 7073

語法:型別 &函式名(形參列表)
特別注意:1.引用作為函式的返回值時,必須在定義函式時在函式名前將&2.用引用作函式的返回值的最大的好處是在記憶體中不產生返回值的副本

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

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

如果真的希望用函式的返回值來初始化乙個引用,應當先建立乙個變數,將函式的返回值賦給這個變數,然後再用該變數來初始化引用:

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

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

3.不能返回區域性變數的引用。如上面的例子,如果temp是區域性變數,那麼它會在函式返回後被銷毀,此時對temp的引用就會成為「無所指」的引用,程式會進入未知狀態。

4.不能返回函式內部通過new分配的記憶體的引用。雖然不存在區域性變數的被動銷毀問題,但如果被返回的函式的引用只是作為乙個臨時變數出現,而沒有將其賦值給乙個實際的變數,那麼就可能造成這個引用所指向的空間(有new分配)無法釋放的情況(由於沒有具體的變數名,故無法用delete手動釋放該記憶體),從而造成記憶體洩漏。因此應當避免這種情況的發生

5當返回類成員的引用時,最好是const引用。這樣可以避免在無意的情況下破壞該類的成員。

6.可以用函式返回的引用作為賦值表示式中的左值

#includeusing namespace std;int value[10];int error=-1;int &func(int n)

int main()

在c++中,引用是除了指標外另乙個可以產生多型效果的手段。也就是說乙個基類的引用可以用來繫結其派生類的例項

class father;//基類(父類)class son:public father//son是father的派生類son son;//son是類son的乙個例項father &ptr=son;//用派生類的物件初始化基類物件的使用特別注意:

ptr只能用來訪問派生類物件中從基類繼承下來的成員如果基類(類father)中定義的有虛函式,那麼就可以通過在派生類(類son)中重寫這個虛函式來實現類的多型。

C C 引用作為函式的返回值

語法 型別 函式名 形參列表 特別注意 1.引用作為函式的返回值時,必須在定義函式時在函式名前將 2.用引用作函式的返回值的最大的好處是在記憶體中不產生返回值的副本 includeusing namespace std float temp float fn1 float r float fn2 f...

C C 引用作為函式的返回值

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

C C 引用作為函式的返回值

語法 型別 函式名 形參列表 特別注意 引用作為函式的返回值時,必須在定義函式時在函式名前將 用引用作函式的返回值的最大的好處是在記憶體中不產生返回值的副本 include using namespace std float temp float fn1 float r float fn2 floa...