演算子オーバーローディング
メニューを表示するにはスワイプしてください
演算子オーバーロードは、オブジェクト指向プログラミング言語における強力な機能であり、ユーザー定義のclassesに対して演算子の動作を再定義することが可能です。演算子をオーバーロードすることで、classのオブジェクトに関する操作に対してカスタム実装を提供でき、より直感的で表現力豊かなコードが実現します。
演算子オーバーロードの構文
オーバーロードは、演算子に対して望ましい動作を実装する特別なメンバ関数またはフレンド関数を定義することで実現されます。演算子をオーバーロードする際の構文は、オーバーロードしたい演算子によって異なります。一般的な構文は次の通りです:
overloading.h
1return_type operator operator_symbol(parameters);
構文、より具体的にはパラメータの数や戻り値の型は、演算子をメンバー関数としてオーバーロードするか、フレンド関数としてオーバーロードするかによっても異なります。
Member.h
Friend.h
123456class Example { public: Example operator+ (const Example& other) { // Define behavior for operator+ } };
オーバーロード可能な演算子の一覧表
以下は、オーバーロード可能なすべての演算子を一覧にした表です。ただし、これらの演算子をオーバーロードすることは可能ですが、classes ですべての演算子をオーバーロードする必要はまったくありません。
ストリーム挿入演算子のオーバーロード
<< および >> 演算子を class 用にオーバーロードするには、通常、出力ストリーム(std::ostream&)または 入力ストリーム(std::istream&)を左オペランド、class の オブジェクト を右オペランドとして受け取るフレンド関数またはメンバー関数を定義します。この関数は、オブジェクトのデータを整形し、ストリームへ出力またはストリームから入力します。
Point.h
123456789101112131415class Point { public: friend std::ostream& operator<<(std::ostream& out, const Point& point); friend std::istream& operator>>(std::istream& in, Point& point); private: int x, y; }; std::ostream& operator<<(std::ostream& out, const Point& point) { return out << "x: " << point.x << ", y: " << point.y << std::endl; } std::istream& operator>>(std::istream& in, Point& point) { return in >> point.x >> point.y; }
<< などのストリーム挿入演算子をオーバーロードすることで、classes の オブジェクト を std::cout などの出力ストリームに送る際に、カスタムの出力動作を定義できます。この機能は、カスタムデータ型を扱う際の可読性や使いやすさの向上に特に有用です。
<< 演算子の出力ストリームへのオーバーロードは、>> 演算子の入力ストリームへのオーバーロードよりも一般的。>> を使った入力操作は、エラーが発生しやすいため。
算術演算子のオーバーロード
他の算術演算子(-, *, /, %)も同様の方法でオーバーロードでき、ユーザー定義型で独自の演算を実装可能。
main.cpp
12345678910111213141516171819202122#include <iostream> class Point { public: Point(int xCoord, int yCoord) : x(xCoord), y(yCoord) {} Point operator+(const Point& other) { return Point(x + other.x, y + other.y); } int getX() { return x; } int getY() { return y; } private: int x, y; }; int main() { Point p = Point(2, 4) + Point(2, 6); std::cout << p.getX() << ' ' << p.getY() << std::endl; }
演算子は Point class のメンバー関数としてオーバーロードされます。別の Point オブジェクトをパラメータとして受け取り、2つの点の合計を表す新しい Point オブジェクトを返します。+ 演算子は -、*、/、または % に置き換えることができ、それに応じて実装ロジックを調整します。
インクリメントおよびデクリメント
前置および後置のインクリメント・デクリメント演算子(++ および --)は、カスタム classes に対してオーバーロードできます。まずは前置バージョンから説明します。
main.cpp
123456789101112131415161718192021222324#include <iostream> class Point { public: Point(int xCoord, int yCoord) : x(xCoord), y(yCoord) {} // Prefix increment operator (++point) Point& operator++() { ++x; ++y; return *this; } int getX() { return x; } int getY() { return y; } private: int x, y; }; int main() { Point p(2, 2); ++p; std::cout << p.getX() << ' ' << p.getY() << std::endl; }
デクリメント演算子は、-- 演算子と減算操作を使用して、インクリメント演算子と同様の方法でオーバーロードされます。
ご覧のとおり、前置インクリメントおよびデクリメント演算子のオーバーロードは簡単です。しかし、後置バージョンでは少し複雑になります。前置と後置の操作には実行順序の違いがあることに注意してください。
後置インクリメントおよびデクリメントをオーバーロードする際には、実行順序の機能も実装する必要があります。 次のような形になります:
main.cpp
1234567891011121314151617181920212223242526#include <iostream> class Point { public: Point(int xCoord, int yCoord) : x(xCoord), y(yCoord) {} // Postfix increment operator (point++) Point operator++(int) { Point temp = *this; // Creating a temp variable ++(this->x); // Incrementing original Point's x ++(this->y); // Incrementing original Point's y return temp; // Returning created temp variable } int getX() { return x; } int getY() { return y; } private: int x, y; }; int main() { Point p(2, 2); p++; std::cout << p.getX() << ' ' << p.getY() << std::endl; }
整数パラメータは、後置インクリメント演算子がオーバーロードされていることをコンパイラに示すためだけに、名前なしで渡される。この指定が必要なのは、前置演算子と後置演算子の宣言が他に区別できないため。
後置インクリメント演算子の実装では、オブジェクトの元の値が一時変数(temp)に保存される。その後、現在のオブジェクトがインクリメントされるが、演算子はtempに保存された値を返す。つまり、変数はインクリメントされるが、変更は次の式でのみ有効となり、演算子は元の値を返す。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください