導入
std::string を + で連結できたように、自分で作った型にも + や ==、<< を使えるようにできます。これが「演算子オーバーロード」です。数学的な型(ベクトル・複素数・分数など)で特に便利です。
説明
operator+ のように「operator + 記号」という名前の関数を定義します。Vec2 a, b; に対して a + b と書けるようにしてみましょう。
#include <iostream>
using namespace std;
struct Vec2 {
double x, y;
Vec2 operator+(const Vec2& other) const { // a + b を定義
return Vec2{ x + other.x, y + other.y };
}
bool operator==(const Vec2& other) const { // a == b を定義
return x == other.x && y == other.y;
}
};
int main() {
Vec2 a{1, 2}, b{3, 4};
Vec2 c = a + b; // operator+ が呼ばれる
cout << c.x << ", " << c.y << endl; // 4, 6
cout << (a == a) << endl; // 1(true)
return 0;
}
cout << v で自作型を表示できるようにするには、operator<< を定義します。これはクラスの外に、friend を使って書くのが定石です。
flowchart LR code["cout << v"] --> op["operator<<(ostream&, const Vec2&)"] op --> out["ostream に x, y を書き込む"]
#include <iostream>
using namespace std;
struct Vec2 {
double x, y;
// friend にすると private にもアクセスでき、外部関数として定義できる
friend ostream& operator<<(ostream& os, const Vec2& v) {
os << "(" << v.x << ", " << v.y << ")";
return os; // つなげて書けるよう ostream を返す
}
};
int main() {
Vec2 v{3, 4};
cout << v << endl; // (3, 4)
return 0;
}
まとめ
operator記号 という関数を定義すると、自作型に演算子を与えられます。<< は friend の外部関数として書き、ostream& を返して連結できるようにします。ただし乱用は禁物で、「直感的に意味が通る」ときだけ使いましょう。