>백엔드 개발 >C++ >C++ 함수 예외 안전 매개변수 전달 메커니즘

C++ 함수 예외 안전 매개변수 전달 메커니즘

王林
王林원래의
2024-04-19 11:06:021198검색

C++에서 함수 매개변수는 값으로 전달될 때 예외로부터 안전합니다. 실제 매개변수가 참조로 전달하면 예외 안전성이 보장되지 않고 실제 매개변수가 정의되지 않은 상태일 수 있기 때문입니다. 모범 사례에서는 값별 전달을 사용하여 함수 호출에 영향을 주지 않는 기본 유형, 경량 개체 및 매개 변수를 전달하고, 참조별 전달을 사용하여 함수 수정이 필요한 대형 개체 또는 매개 변수를 전달하는 것이 좋습니다.

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

예외 안전성을 보장하려면 다음과 같은 경우 값별 전달을 사용하는 것이 좋습니다.

  • 매개변수가 기본 유형(예: int, char, double)인 경우.
  • 매개변수는 가벼운 개체(예: 작은 구조)입니다.
  • 실제 매개변수를 변경해도 호출 기능에 영향을 주어서는 안 됩니다.

다음과 같은 경우 참조별 전달을 사용하세요.

  • 매개변수가 큰 개체(예: 컨테이너, 복잡한 구조)인 경우.
  • 실제 매개변수의 변경 사항은 호출 함수에 반영되어야 합니다.

실용예

스트림을 읽고 파일에 쓰는 함수를 생각해 보세요.

값으로 스트림 전달:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.