コンパイラで生成された演算子のオーバーロード: C クラスに Operator==() または Operator!=() がないのはなぜですか?
C コンパイラはすぐにデフォルトのコンストラクター、コピーおよび移動コンストラクター、デストラクター、代入演算子 (operator=) などの一般的な演算子を生成します。ただし、比較演算子 (operator==、operator!=) と同じ利便性はありません。この欠落により、コンパイラーが単純なクラスのメンバーごとの比較を実行できないという疑問が生じます。
コンパイラー設計の決定
コンパイラー生成の比較を提供しないという決定演算子は、デフォルトのコピー構築に関する懸念から生じています。 Bjarne Stroustrup 氏は、著書『The Design and Evolution of C』の中で、デフォルトのコピー操作について、意図しない問題のある動作の可能性を挙げて、懸念を表明しています。
下位互換性と言語の進化
C のレガシーは C に大きな影響を与え、下位互換性のためにデフォルトの代入とコピー コンストラクターを継承しました。 Stroustrup 氏の消極にもかかわらず、これらの機能は広く採用されるようになりました。互換性の維持に重点を置いたため、デフォルトの比較演算子の導入が妨げられた可能性があります。デフォルトの比較演算子は、提供されている単純な演算に比べて潜在的に複雑になる可能性があります。
設計目標の矛盾
コンパイラで生成された比較演算子を使用すると、オブジェクトの比較が容易になりますが、C で明示的な演算子のオーバーロードを強制する原則と矛盾する可能性があります。この設計原則は、開発者が演算子の動作を慎重に検討し、一貫性を確保し、意図しない動作を回避することを奨励します。
開発者の考慮事項
コンパイラの自動化を重視する開発者にとって、デフォルトの比較演算子は手動で定義する必要があります。ただし、これにより、メモリ割り当てやオブジェクト セマンティクスなどの要素を考慮して、比較動作をクラスのニーズに合わせて調整する機会が得られます。
以上がなぜ C コンパイラは `operator==()` と `operator!=()` を生成しないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。