関数のオーバーロード — 同じ名前を持つが異なる引数を持つ複数の関数を作成する能力。これは可読性を向上させ、直感的なインターフェースを提供するために使用されます。
演算子のオーバーロード — 標準の演算子がユーザー定義のデータ型(クラスまたは構造体)でどのように動作するかを定義する能力。
演算子のオーバーロードの制限:
, ., .*, ::, 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::set、std::map)を使用しようとするとコンパイルエラーが発生しました。
物語
開発者はMatrixクラスの+演算子をオーバーロードしましたが、新しいオブジェクトを返すのではなく、常に左オペランドを変更しました。その結果、予期しない副作用が生じ、「純粋」操作の原則が破られました。
物語
異なる引数の型を持つ関数のオーバーロード時に const 修飾子が考慮されなかった:void foo(SomeClass&); void foo(const SomeClass&);これにより関数呼び出しの曖昧さが生じ、一時オブジェクトを渡す際にコンパイルエラーが発生しました。