Menu
CoddyTech

演算子オーバーロード入門

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)を呼び出す

すべての演算子をオーバーロードできるわけではありません。スコープ解決演算子 ::、メンバーアクセス .、三項演算子 ?:、および sizeof はオーバーロードできません。さらに、新しい演算子を作成したり、演算子の優先順位を変更したりすることはできません。* は常に + より先に評価されます。

演算子は、(上記のように)メンバー関数として、または非メンバー関数として実装できます。これからのレッスンでは、それぞれの方法をいつ使うべきか、また特定の種類の演算子をどのようにオーバーロードするかを学びます。

challenge icon

チャレンジ

簡単

2D 座標を表し、+ 演算子を使って2つの点を足し合わせられる Point クラスを作りましょう。これは演算子オーバーロードへの第一歩です。独自のクラスを、使い慣れた演算子で扱えるようにします。

コードを整理するために、2つのファイルを作成します。

  • Point.h: x 座標と y 座標(どちらも int)を格納する Point クラスを定義します。クラスには次の要素を含めてください。
    • x 座標と y 座標のための private メンバー
    • x と y の値を受け取るコンストラクター
    • ゲッター getX() と getY()(どちらも const)
    • 2つの点を足し合わせ、座標を合算した新しい Point を返すオーバーロードされた + 演算子

    + 演算子は、別の Point を const 参照で受け取り、新しい Point を返すメンバー関数として実装します。どちらのオペランドも変更しないため、const を付けてください。

  • main.cpp: 入力から4つの整数(別々の行にある x1、y1、x2、y2)を読み込み、2つの点を表します。2つの Point オブジェクトを作成し、+ 演算子を使って足し合わせて、結果を表示します。

    出力形式:

    Point 1: (<x1>, <y1>)
    Point 2: (<x2>, <y2>)
    Sum: (<sum_x>, <sum_y>)

ここで重要なのは、p1 + p2 が実際には裏側で p1.operator+(p2) を呼び出しているということです。オーバーロードした演算子を使えば、Point p3 = p1 + p2; のように直感的に書けます。Point p3 = p1.add(p2); のように書く必要はありません。

入力文字列を整数に変換するには std::stoi() を使ってください。ヘッダーファイルにインクルードガードを付けるのを忘れないでください。

自分で試してみよう

#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;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: C++オンラインコンパイラ