在 c++++ 中,函數(shù)參數(shù)按值傳遞時異常安全,因?qū)崊⒈3衷贾担话匆脗鬟f不保證異常安全,實(shí)參可能處于未定義狀態(tài)。最佳實(shí)踐建議使用按值傳遞傳遞基本類型、輕量級對象和不影響函數(shù)調(diào)用的參數(shù),而使用按引用傳遞傳遞大型對象或需要函數(shù)修改的參數(shù)。
C++ 函數(shù)異常安全參數(shù)傳遞機(jī)制
在 C++ 中,當(dāng)調(diào)用函數(shù)時,參數(shù)可以按值傳遞或按引用傳遞。按值傳遞意味著創(chuàng)建實(shí)參的副本,而按引用傳遞則使用實(shí)參的地址。
按值傳遞
void foo(int x) { // 對 x 執(zhí)行操作 }
登錄后復(fù)制
按引用傳遞
void foo(int& x) { // 對 x 執(zhí)行操作 }
登錄后復(fù)制
當(dāng)函數(shù)拋出異常時,參數(shù)傳遞機(jī)制影響著實(shí)參的狀態(tài)。
按值傳遞異常安全性
按值傳遞是異常安全的,因?yàn)槿绻瘮?shù)拋出異常,實(shí)參將保持其原始值。例如:
int main() { int x = 1; try { foo(x); } catch(...) { // x 仍為 1 } }
登錄后復(fù)制
按引用傳遞異常安全性
按引用傳遞不保證異常安全。如果函數(shù)拋出異常,實(shí)參可能會處于未定義狀態(tài),因?yàn)楹瘮?shù)可能改變了引用。例如:
int main() { int x = 1; try { foo(x); } catch(...) { // x 可能不是 1 } }
登錄后復(fù)制
最佳實(shí)踐
為了確保異常安全性,建議在以下情況下使用按值傳遞:
參數(shù)是基本類型(例如,int、char、double)。參數(shù)是輕量級對象(例如,小結(jié)構(gòu)體)。對實(shí)參的更改不應(yīng)影響調(diào)用函數(shù)。
在以下情況下使用按引用傳遞:
參數(shù)是大型對象(例如,容器、復(fù)雜結(jié)構(gòu)體)。對實(shí)參的更改需要反映在調(diào)用函數(shù)中。
實(shí)戰(zhàn)案例
考慮一個函數(shù),它讀取流并將其寫入文件。
按值傳遞流:
void writeToFile(std::istream& stream, std::ofstream& file) { std::string line; while (getline(stream, line)) { file << line << std::endl; } }
登錄后復(fù)制
按引用傳遞流:
void writeToFile(std::istream& stream, std::ofstream& file) { std::string line; while (getline(stream, line)) { file << line << std::endl; } stream.close(); // 按引用傳遞允許在函數(shù)退出時關(guān)閉流 }
登錄后復(fù)制
通過按引用傳遞流,我們可以確保在函數(shù)退出時始終關(guān)閉流,從而確保異常發(fā)生時流處于已關(guān)閉狀態(tài)。