在 C 中,函數參數按值傳遞時異常安全,因實參保持原始值;按引用傳遞不保證異常安全,實參可能處於未定義狀態。最佳實踐建議使用按值傳遞傳遞基本類型、輕量級物件和不影響函數呼叫的參數,而使用按引用傳遞傳遞大型物件或需要函數修改的參數。
C 函數異常安全參數傳遞機制
在C 中,當呼叫函數時,參數可以按值傳遞或按引用傳遞。按值傳遞意味著建立實參的副本,而按引用傳遞則使用實參的位址。
按值傳遞
void foo(int x) { // 对 x 执行操作 }
按引用傳遞
#void foo(int& x) { // 对 x 执行操作 }
當函數拋出例外時,參數傳遞機制會影響著實參的狀態。
按值傳遞異常安全性
按值傳遞是異常安全的,因為如果函數拋出異常,實參將保持其原始值。例如:
int main() { int x = 1; try { foo(x); } catch(...) { // x 仍为 1 } }
按引用傳遞異常安全性
按引用傳遞不保證異常安全。如果函數拋出異常,實參可能會處於未定義狀態,因為函數可能改變了引用。例如:
int main() { int x = 1; try { foo(x); } catch(...) { // x 可能不是 1 } }
最佳實踐
為了確保異常安全性,建議在下列情況下使用按值傳遞:
在下列情況下使用依參考傳遞:
實戰案例
考慮一個函數,它會讀取流並將其寫入檔案。
按值傳遞流:
void writeToFile(std::istream& stream, std::ofstream& file) { std::string line; while (getline(stream, line)) { file << line << std::endl; } }
按引用傳遞流:
void writeToFile(std::istream& stream, std::ofstream& file) { std::string line; while (getline(stream, line)) { file << line << std::endl; } stream.close(); // 按引用传递允许在函数退出时关闭流 }
透過按引用傳遞流,我們可以確保在函數退出時始終關閉流,從而確保異常發生時流處於已關閉狀態。
以上是C++ 函式異常安全參數傳遞機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!