ホームページ >バックエンド開発 >C++ >C++ 関数の例外安全なパラメーター受け渡しメカニズム

C++ 関数の例外安全なパラメーター受け渡しメカニズム

王林
王林オリジナル
2024-04-19 11:06:021194ブラウズ

C では、実パラメータは元の値を保持するため、値渡しの場合、関数パラメータは例外安全です。参照渡しでは例外安全性が保証されず、実際のパラメータは未定義の状態になる可能性があります。ベスト プラクティスでは、値渡しを使用してプリミティブ型、軽量オブジェクト、関数呼び出しに影響を与えないパラメーターを渡し、参照渡しを使用して関数の変更が必要な大きなオブジェクトやパラメーターを渡すことをお勧めします。

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
  }
}

ベスト プラクティス

例外の安全性を確保するには、次の状況では値渡しを使用することをお勧めします。

Parameters 基本型 (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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。