C++引用與函數返回類型

本文梳理了個人對於C++引用及函數參數傳遞的一些思考,如有紕漏,歡迎指正。

若函數返回類型是引用,則該引用綁定return後面的左值表達式(一般是變量);若函數返回類型非引用,則該返回類型是函數調用點創建的臨時對象的類型,用return後面的語句來拷貝初始化它。可見,
1. 由於引用不是對象,所以當返回類型是引用時,無需創建臨時對象,節省了內存。
2. 同時,顯然我們不能返回函數中定義的局部變量的引用,因爲它在函數結束後就被釋放了。
3. 概括來講,使用引用的目的就是避免拷貝操作,C++ 11新引入的右值引用的概念也是爲了這個目的。

設想一種應用場景是某函數返回值作爲另一個函數的一個實參,並且該函數返回類型是普通類型,所以調用點創建了一個臨時對象,接受函數返回值的拷貝。但作爲另一個函數的實參,我們不希望該臨時對象再以拷貝的方式初始化形參,那麼可以將形參定義爲const T&類型,接受該臨時對象(臨時對象一定是右值),但侷限性在於該函數自此無法修改T的值;所以更靈活的方案是將形參定義爲T&&類型,同樣接受該臨時對象,但無const限制。該臨時對象的內存由於被右值引用,所以不會被釋放。以上形參定義爲T&&會帶來另一個問題:若實參不是臨時對象,是一個左值怎麼辦?由於T&&不接受左值,所以當我們確信該左值之後不在其他地方使用的前提下,可以使用move(lvalue)將它轉化爲右值。

引用類型必須與它所綁定的對象類型一致,但有兩個例外:
1. const引用在初始化時可以綁定任何可轉化類型的對象(包括字面值常量);
2. 基類引用(或指針)可以綁定派生類對象,動態綁定涵義在於運行時調用哪個類定義的虛函數版本在編譯時是未知的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章