C++에서 함수 매개변수는 값으로 전달될 때 예외로부터 안전합니다. 실제 매개변수가 참조로 전달하면 예외 안전성이 보장되지 않고 실제 매개변수가 정의되지 않은 상태일 수 있기 때문입니다. 모범 사례에서는 값별 전달을 사용하여 함수 호출에 영향을 주지 않는 기본 유형, 경량 개체 및 매개 변수를 전달하고, 참조별 전달을 사용하여 함수 수정이 필요한 대형 개체 또는 매개 변수를 전달하는 것이 좋습니다.
C++ 함수 예외 안전 매개변수 전달 메커니즘
C++에서는 함수를 호출할 때 매개변수를 값이나 참조로 전달할 수 있습니다. 값으로 전달한다는 것은 실제 매개변수의 복사본을 만드는 것을 의미하고, 참조로 전달한다는 것은 실제 매개변수의 주소를 사용한다는 의미입니다.
값으로 전달
void foo(int x) { // 对 x 执行操作 }
참조로 전달
void foo(int& x) { // 对 x 执行操作 }
함수에서 예외가 발생하면 매개변수 전달 메커니즘이 실제 매개변수의 상태에 영향을 미칩니다.
값별 전달 예외 안전성
값별 전달은 예외로부터 안전합니다. 함수가 예외를 throw하면 실제 매개변수가 원래 값을 유지하기 때문입니다. 예:
int main() { int x = 1; try { foo(x); } catch(...) { // x 仍为 1 } }
참조별 통과 예외 안전성
참조별 통과는 예외 안전성을 보장하지 않습니다. 함수가 예외를 발생시키는 경우 함수가 참조를 변경했을 수 있으므로 실제 매개변수는 정의되지 않은 상태일 수 있습니다. 예:
int main() { int x = 1; try { foo(x); } catch(...) { // x 可能不是 1 } }
Best Practices
예외 안전성을 보장하려면 다음과 같은 경우 값별 전달을 사용하는 것이 좋습니다.
다음과 같은 경우 참조별 전달을 사용하세요.
실용예
스트림을 읽고 파일에 쓰는 함수를 생각해 보세요.
값으로 스트림 전달:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!