演算子オーバーロード入門
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 40/104。
演算子のオーバーロードを使うと、カスタムクラスで使用したときに、+、-、==などの演算子がどのように動作するかを定義できます。a.add(b)のようなメソッドを呼び出す代わりに、より直感的なa + bと記述できます。
C++では、演算子は本質的に特別な名前を持つ関数です。演算子をオーバーロードするには、operatorキーワードの後に記号を続けて、関数を定義します。
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// + 演算子をオーバーロードする
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};これで、2つのベクトルを自然に加算できます。
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // v1.operator+(v2) を呼び出すすべての演算子をオーバーロードできるわけではありません。スコープ解決演算子 ::、member アクセス .、三項演算子 ?:、および sizeof はオーバーロードできません。さらに、新しい operator を作成したり、operator の優先順位を変更したりすることはできません。* は常に + より先に評価されます。
演算子は(上記のように)メンバー関数として、または非メンバー関数として実装できます。これからのレッスンでは、それぞれのアプローチをいつ使用するか、また特定のカテゴリの演算子をどのようにオーバーロードするかを学びます。
チャレンジ
簡単Point クラスを作成しましょう。このクラスは 2D 座標を表し、+ operator を使って 2 つの点を加算できるようにします。これは operator オーバーロードへの最初の一歩であり、カスタムクラスを使い慣れた operator と連携させる方法を学びます。
コードを整理するために、2 つのファイルを作成します。
Point.h: x 座標と y 座標(どちらもint)を保持するPointクラスをdefineします。このクラスには次のものが必要です。- x 座標と y 座標用の private メンバー
- x と y の値を受け取る constructor
- Getters
getX()とgetY()(どちらも const) - 2 つの点を加算し、座標を combined した新しい
Pointを return するオーバーロードされた+operator
+operator は、別のPointを const reference で受け取り、新しいPointを return する member function として実装します。どちらの operand も modify しないため、constとして Mark します。main.cpp: 2 つの点を表す 4 つの整数(x1、y1、x2、y2 を別々の行に入力)を input から Read します。2 つのPointobjects を Create し、+operator を使ってそれらを加算し、results を表示します。Output format:
Point 1: (<x1>, <y1>) Point 2: (<x2>, <y2>) Sum: (<sum_x>, <sum_y>)
ここでの key insight は、p1 + p2 が実際には内部で p1.operator+(p2) を呼び出しているということです。オーバーロードした operator によって、Point p3 = p1 + p2; のような直感的なコードを、Point p3 = p1.add(p2); のようなコードの代わりに記述できます。
std::stoi() を使って input 文字列を整数に変換します。header file の header guards を忘れないでください。
自分で試してみよう
#include <iostream>
#include <string>
#include "Point.h"
using namespace std;
int main() {
// 入力を読み取る
string line1, line2, line3, line4;
getline(cin, line1);
getline(cin, line2);
getline(cin, line3);
getline(cin, line4);
int x1 = stoi(line1);
int y1 = stoi(line2);
int x2 = stoi(line3);
int y2 = stoi(line4);
// TODO: 入力値を使用して2つのPointオブジェクトを作成する
// TODO: +演算子を使用して2つの点を加算する
// TODO: 結果を指定の形式で出力する:
// Point 1: (<x1>, <y1>)
// Point 2: (<x2>, <y2>)
// Sum: (<sum_x>, <sum_y>)
return 0;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ