ProgrammingC++バックエンド開発者

C++におけるパラメータの受け渡し方法の継承(値渡し、ポインタ渡し、参照渡し)と、それぞれの方法の落とし穴はどのようなものですか?

Hintsage AIアシスタントで面接を突破

答え。

C++では、関数のパラメータ(メソッドのメンバーを含む)は次のように渡すことができます:

  • 値渡し(by value): 関数内にオブジェクトのコピーが作成されます。元のオブジェクトは変更されませんが、動的リソースがある場合は不正確なコピーが起こる可能性があります!
  • ポインタ渡し(by pointer): アドレスを渡します。元のオブジェクトを変更できますが、nullptrの可能性があり、メモリの所有権と検証が不足するため危険性があります。
  • 参照渡し(by reference): ポインタ渡しのように機能しますが、構文は通常の変数のようになります。参照は有効でなければならず、リダイレクトできませんが、constを使用することでコピーのオーバーヘッドを減らします。

例:

void foo(int value); // 値渡し void foo(int* ptr); // ポインタ渡し void foo(const int& ref); // 参照渡し(大きなオブジェクトには最適!)

参照渡しを使用することで最適化(コピーエリジオン)が実現される可能性があり、大きなオブジェクトにはconst &を推奨します。ポインタの場合は常にnullptrでチェックしてください。

ひねりのある質問。

const MyClass& objMyClass objの関数パラメータの違いは何ですか?

答え:

const MyClass&はオブジェクトをコピーせず、変更できないアクセスを提供します(大きなオブジェクトには最適)。MyClass objは常にコピーを作成するため、大きなサイズや適切なコピー(例:ディープコピーが実装されていない)の欠如があると過剰なコストがかかります。

void process(const std::string& s); // コピーしない void process(std::string s); // コピーする

このトピックの微妙な点を知らないことから生じた実際のエラーの例。


物語 企業の数学構造ライブラリで、プログラマは大きなコンテナを値渡しで渡すことで処理を高速化しようとしました。これにより、各関数呼び出しの際に大きなオーバーヘッドが発生し、パフォーマンスが半分に低下しました。


物語 ユーザー管理モジュールでは、nullptrのチェックなしでポインタが使用されていました。無効なポインタへのアクセス時に偶発的な障害が発生し、デバッグに数ヶ月かかりました。


物語 画像処理プロジェクトの一部の関数はオブジェクトを値渡しで受け取り、別の部分は参照渡しで受け取っていました。あるクラスではディープコピーが実装されておらず、値渡し後にメモリリークやリソースの暗黙の共有が発生しました。