從品牌網(wǎng)站建設(shè)到網(wǎng)絡(luò)營(yíng)銷策劃,從策略到執(zhí)行的一站式服務(wù)
來(lái)源:公司資訊 | 2021.08.18
本文主要介紹C++中的值傳遞(pass-by-value)和引用傳遞(pass-by-reference)的區(qū)別。
1 pass-by-value
在 C++ 里面,一個(gè)函數(shù)在使用參數(shù)時(shí),如果使用 pass-by-value 方式,那么編譯系統(tǒng)會(huì)在調(diào)用該函數(shù)的地方,把實(shí)參復(fù)制一份傳給函數(shù)的形參。
用法示例:int FunA(string strTest);
這種做法有以下幾個(gè)問(wèn)題:
第一,如果在函數(shù)里修改傳給函數(shù)的參數(shù)值,實(shí)際上我們修改的只是實(shí)參的副本,而在調(diào)用函數(shù)的位置,這個(gè)實(shí)參值本身沒(méi)有改變;
第二,此過(guò)程中進(jìn)行的副本拷貝動(dòng)作會(huì)耗費(fèi)系統(tǒng)的資源,如果拷貝的參數(shù)是比較復(fù)雜的 struct 或者 class 等類型,復(fù)制出一份副本的成本(時(shí)空開銷)很大;
2 pass-by-reference
在 C++ 里面,一個(gè)函數(shù)在使用參數(shù)時(shí),如果使用 pass-by-reference 方式,那么編譯系統(tǒng)會(huì)在調(diào)用該函數(shù)的地方,直接將實(shí)參的內(nèi)存地址(指針)傳給形參。
用法示例:int FunA(string & strTest);
這種做法有以下幾點(diǎn)好處:
第一,由于函數(shù)的參數(shù)傳遞的是把實(shí)參的地址拷貝給形參,因此形參和實(shí)參對(duì)應(yīng)的是同一塊內(nèi)存地址,所以對(duì)形參的修改自然會(huì)反映到實(shí)參上;
第二,在 C++ 中,指針(內(nèi)存地址)是一個(gè) int 類型,所以即使在 64 位系統(tǒng)中,指針的復(fù)制成本(8字節(jié))也是完全可以接受的;
第三,因?yàn)?C++ 規(guī)定引用不能為空,所以在函數(shù)中傳進(jìn)來(lái)引用可以直接使用,而如果傳進(jìn)來(lái)的是指針類型(實(shí)際上是值傳遞、引用傳遞之外的指針傳遞方式),那么還需要先判斷指針是否為空,易用性不強(qiáng)。
3 總結(jié)
綜合對(duì)比上述兩種函數(shù)參數(shù)的值傳遞方式,可以看出在C++中,一般情況下都會(huì)優(yōu)先使用“引用傳遞”。
例如:
int FunA(const string strTest) // 值傳遞
{
// some codes
}
int FunB(const string & strTest) // 引用傳遞,這里加了const關(guān)鍵字,為常引用。優(yōu)選
{
// some codes
}
————————————————
版權(quán)聲明:本文為CSDN博主「liitdar」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/liitdar/article/details/85982561