Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 演算子オーバーローディング | ポリモーフィズム概要
C++オブジェクト指向プログラミング

book演算子オーバーローディング

メニューを表示するにはスワイプしてください

演算子オーバーロードは、オブジェクト指向プログラミング言語における強力な機能であり、ユーザー定義のclassesに対して演算子の動作を再定義することを可能にします。演算子をオーバーロードすることで、classオブジェクトに関わる操作に対してカスタム実装を提供でき、より直感的で表現力豊かなコードを実現します。

演算子オーバーロードの構文

オーバーロードは、目的の動作を実装する特別なメンバー関数またはフレンド関数を定義することで実現されます。演算子をオーバーロードする際の構文は、オーバーロードしたい演算子によって異なります。一般的な構文は次のとおりです:

overloading.h

overloading.h

copy
1
return_type operator operator_symbol(parameters);

構文、より具体的にはパラメータの数や戻り値の型は、演算子をメンバー関数としてオーバーロードするか、フレンド関数としてオーバーロードするかによっても異なります。

Member.h

Member.h

Friend.h

Friend.h

copy
123456
class Example { public: Example operator+ (const Example& other) { // Define behavior for operator+ } };

オーバーロード可能な演算子の一覧表

以下は、オーバーロード可能なすべての演算子を一覧にした表です。ただし、これらの演算子をオーバーロードすることは可能ですが、classes に対してすべてをオーバーロードする必要はまったくありません

ストリーム挿入演算子のオーバーロード

<< に対して >> および class 演算子をオーバーロードするには、通常、出力ストリームstd::ostream&)または 入力ストリームstd::istream&)を左オペランド、classオブジェクト を右オペランドとして受け取るフレンド関数またはメンバー関数を定義します。この関数は、オブジェクト のデータを整形し、ストリームへ出力またはストリームから入力します。

Point.h

Point.h

copy
123456789101112131415
class 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 などの出力ストリームに送る際に、カスタムの出力動作を定義できます。この機能は、カスタムデータ型を扱う際に、コードの可読性や使いやすさを向上 させるのに特に有用です。

Note
注意

出力ストリーム用の<<演算子のオーバーロードは、入力ストリーム用の>>演算子のオーバーロードよりも一般的です。これは、>>による入力操作がよりエラーが発生しやすいためです。

算術演算子のオーバーロード

他の算術演算子(-*/%)も同様の方法でオーバーロードでき、ユーザー定義型で独自の演算を実装可能。

main.cpp

main.cpp

copy
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 object をパラメータとして受け取り、2つのポイントの合計を表す新しい Point object を返す。+ 演算子は -*/、または % に置き換えることができ、それに応じて実装ロジックを調整する。

インクリメントおよびデクリメント

前置および後置のインクリメント・デクリメント演算子(++ および --)は、カスタム classes に対してオーバーロード可能。まずは前置バージョンから:

main.cpp

main.cpp

copy
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; }
Note
注意

デクリメント演算子は、-- 演算子と減算操作を使用して、インクリメント演算子と同様の方法でオーバーロードされます。

ご覧のとおり、前置インクリメントおよびデクリメント演算子のオーバーロードは簡単です。しかし、後置バージョンでは少し複雑になります。前置と後置の操作には、実行順序の違いがあることに注意してください。

後置インクリメントおよびデクリメントをオーバーロードする際には、実行順序の機能も実装する必要があります。 次のような形になります:

main.cpp

main.cpp

copy
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; }
Note
注意

整数パラメータは、後置インクリメント演算子がオーバーロードされていることをコンパイラに示すためだけに、名前なしで渡されます。これは、前置および後置演算子の宣言が他に区別できないため、必要となります。

後置インクリメント演算子の実装では、オブジェクトの元の値が一時変数(tempに保存されます。その後、現在のオブジェクトがインクリメントされますが、演算子はtempに保存された値を返します。つまり、変数はインクリメントされますが、変更は次の式でのみ有効となり、演算子は元の値を返します

question mark

演算子のオーバーロードとは何か。

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 5.  4

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 5.  4
some-alt