當(dāng)以傳值方式(pass-by-value)傳遞參數(shù)時(shí),如果函數(shù)內(nèi)并不對(duì)傳入的參數(shù)加以修改,以常量引用(const reference) 的方式可提高效率。
class Cclass {
... ...
};
void func1(Cclass a); // 直接傳值
void func2(const Cclass& b); // const reference
在調(diào)用func1時(shí),壓入堆棧的是一個(gè)Cclass對(duì)象,此時(shí)會(huì)引起拷貝構(gòu)造函數(shù)(copy-construct)的調(diào)用,從而在函數(shù)內(nèi)部產(chǎn)生一個(gè)臨時(shí)對(duì)象。當(dāng)函數(shù)返回時(shí),要釋放該對(duì)象又會(huì)引起析構(gòu)函數(shù)的調(diào)用。而對(duì)于函數(shù)func2,調(diào)用時(shí)壓入堆棧的僅僅是一個(gè)地址,從而節(jié)省了func1中的開(kāi)銷(xiāo)。但使用引用傳參有一個(gè)缺點(diǎn),就是該函數(shù)對(duì)編程人員隱藏了它所傳遞的是一個(gè)地址這個(gè)事實(shí)。
比如,有一個(gè)函數(shù)如下定義:
void foo(Cclass& a);
在使用時(shí)的調(diào)用如下:
Cclass ca;
foo(ca); // 此時(shí)可能會(huì)誤認(rèn)為傳入的僅是值,如果該函數(shù)中改變了ca的值就會(huì)造成以想不到的錯(cuò)誤
// 調(diào)試也困難
解決的辦法是,統(tǒng)一函數(shù)定義習(xí)慣:
對(duì)函數(shù)內(nèi)要修改的參數(shù)以指針?lè)绞剑徊恍薷牡膮?shù)以const reference方式。
class Cclass {
... ...
};
void func1(Cclass a); // 直接傳值
void func2(const Cclass& b); // const reference
在調(diào)用func1時(shí),壓入堆棧的是一個(gè)Cclass對(duì)象,此時(shí)會(huì)引起拷貝構(gòu)造函數(shù)(copy-construct)的調(diào)用,從而在函數(shù)內(nèi)部產(chǎn)生一個(gè)臨時(shí)對(duì)象。當(dāng)函數(shù)返回時(shí),要釋放該對(duì)象又會(huì)引起析構(gòu)函數(shù)的調(diào)用。而對(duì)于函數(shù)func2,調(diào)用時(shí)壓入堆棧的僅僅是一個(gè)地址,從而節(jié)省了func1中的開(kāi)銷(xiāo)。但使用引用傳參有一個(gè)缺點(diǎn),就是該函數(shù)對(duì)編程人員隱藏了它所傳遞的是一個(gè)地址這個(gè)事實(shí)。
比如,有一個(gè)函數(shù)如下定義:
void foo(Cclass& a);
在使用時(shí)的調(diào)用如下:
Cclass ca;
foo(ca); // 此時(shí)可能會(huì)誤認(rèn)為傳入的僅是值,如果該函數(shù)中改變了ca的值就會(huì)造成以想不到的錯(cuò)誤
// 調(diào)試也困難
解決的辦法是,統(tǒng)一函數(shù)定義習(xí)慣:
對(duì)函數(shù)內(nèi)要修改的參數(shù)以指針?lè)绞剑徊恍薷牡膮?shù)以const reference方式。

