本文主要介紹C++中的 值傳遞(pass-by-value) 和 引用傳遞(pass-by-reference) 的區別。
1 pass-by-value
在 C++ 里面,一個函數在使用參數時,如果使用 pass-by-value 方式,那么編譯系統會在調用該函數的地方, 把實參復制一份傳給函數的形參 。
用法示例:int FunA(string strTest);
這種做法有以下幾個問題:
- 第一,如果在函數里修改傳給函數的參數值,實際上我們修改的只是 實參的副本 ,而在調用函數的位置,這個 實參值 本身沒有改變;
- 第二,此過程中進行的副本拷貝動作會耗費系統的資源,如果拷貝的參數是比較復雜的 struct 或者 class 等類型,復制出一份副本的成本(時空開銷)很大;
2 pass-by-reference
在 C++ 里面,一個函數在使用參數時,如果使用 pass-by-reference 方式,那么編譯系統會在調用該函數的地方, 直接將實參的內存地址(指針)傳給形參 。
用法示例:int FunA(string & strTest);
這種做法有以下幾點好處:
- 第一,由於函數的參數傳遞的是把實參的地址拷貝給形參,因此形參和實參對應的是同一塊內存地址,所以對形參的修改自然會反映到實參上;
- 第二,在 C++ 中,指針的地址是一個 int 類型,說以即使在 64 位系統中,指針地址的復制成本(8字節)也是可以接受的;
- 第三,因為 C++ 規定引用不能為空,所以在函數中傳進來引用可以直接使用,雅思報考而如果傳進來的是指針類型(實際上是值傳遞、引用傳遞之外的指針傳遞方式),那么還需要先判斷指針是否為空,易用性不強。
3 總結
綜合對比上述兩種函數參數的值傳遞方式,可以看出在C++中, 一般情況下 都會優先使用“引用傳遞”。
例如:
int FunA(const string strTest) // 值傳遞
{
// some code
}
int FunB(const string & strTest) // 引用傳遞,這里加了const關鍵字,為常引用。優選
{
// some code
}