ProgrammingC++ 開発者

C++における関数のオーバーロード(Function Overloading)と演算子のオーバーロード(Operator Overloading)とは何ですか?制限は何ですか、オーバーロード使用時のエラーはどのような危険がありますか?ユーザー定義クラスのための加算演算子のオーバーロードの例を示してください。

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

回答。

関数のオーバーロード — 同じ名前を持つが異なる引数を持つ複数の関数を作成する能力。これは可読性を向上させ、直感的なインターフェースを提供するために使用されます。

演算子のオーバーロード — 標準の演算子がユーザー定義のデータ型(クラスまたは構造体)でどのように動作するかを定義する能力。

演算子のオーバーロードの制限

  • すべての演算子をオーバーロードすることはできません(, ., .*, ::, sizeof, ?: など)。
  • 演算子はメンバー関数またはフレンド関数である必要があります。
  • セマンティクスを再定義して完全に新しい構文を作成することはできません。

「+」演算子のオーバーロードの例:

class Vector2D { public: float x, y; Vector2D(float _x, float _y): x(_x), y(_y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };

トリッキーな質問。

C++でカンマ演算子(,)をオーバーロードすることは許可されていますか?もしそうなら、どのような目的で使用される可能性がありますか?

回答:
はい、カンマ演算子はユーザー定義のクラスでオーバーロードできます。
ただし、カンマ演算子のオーバーロードは意味がある場合にのみ行うべきです。そうしないと、コードを読む人を混乱させ、予期しない結果を引き起こす可能性があります。

struct Logger { Logger& operator,(const std::string& msg) { std::cout << msg; return *this; } };

トピックの詳細を知らずに起こる現実的なエラーの例。


物語
数学ライブラリ内で、オブジェクトを比較するために == 演算子がオーバーロードされましたが、< 演算子のオーバーロードを忘れていました。これにより、比較演算子を必要とするSTLコンテナ(たとえば std::setstd::map)を使用しようとするとコンパイルエラーが発生しました。


物語
開発者は Matrix クラスの + 演算子をオーバーロードしましたが、新しいオブジェクトを返すのではなく、常に左オペランドを変更しました。その結果、予期しない副作用が生じ、「純粋」操作の原則が破られました。


物語
異なる引数の型を持つ関数のオーバーロード時に const 修飾子が考慮されなかった:

void foo(SomeClass&); void foo(const SomeClass&);

これにより関数呼び出しの曖昧さが生じ、一時オブジェクトを渡す際にコンパイルエラーが発生しました。