演算子のオーバーロード

演算子のオーバーロードを使って Vector2(二次元座標)Class を定義します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. メソッドと同じように演算子もオーバーロードすることが出来ます。
    二次元座標を定義する Vector2 Class を教材にして、演算子をオーバーロードする方法を説明します。
  2. float 型で、X座標とY座標を格納する領域を定義します。
    Constructor に引数が無いときは、X と Y をゼロでクリアします。
    座標が渡されたときは、X と Y にその座標を格納します。
    /*★ 演算子のオーバーロード    前田 稔 ★*/
    #include <iostream>
    using namespace std;
    
    class Vector2
    { public:
        float X;
        float Y;
    
        Vector2()
        {   X= 0.0f;
            Y= 0.0f;
        }
        Vector2(float x, float y)
        {   X= x;
            Y= y;
        }
    
  3. 次のメソッド(関数)が「+演算子」をオーバーロードする関数です。
    Vector2 同士を加算した結果を Vector2 ans に格納してリターンします。
    このようにクラスを定義するブロックの中で実装すると inline 関数となります。
        Vector2 operator+(Vector2 obj)
        {
           Vector2  ans;
           ans.X = this->X + obj.X;
           ans.Y = this->Y + obj.Y;
           return ans;
        }
        
  4. 「-演算子」をオーバーロードする関数も同様です。
        Vector2 operator-(Vector2 obj)
        {
           Vector2  ans;
           ans.X = this->X - obj.X;
           ans.Y = this->Y - obj.Y;
           return ans;
        }
    };
    
  5. main() では *vt1, *vt2, *vt3 を定義して「+」と「-」を使って演算してみました。
    void  main()
    {   Vector2 *vt1,*vt2,*vt3;
    
        vt1= new Vector2(200,100);
        vt2= new Vector2(20,10);
        vt3= new Vector2(32.1f,23.4f);
        cout << "X=" << vt1->X << "  Y=" << vt1->Y << endl;
        *vt1= *vt1 + *vt2;
        cout << "X=" << vt1->X << "  Y=" << vt1->Y << endl;
        *vt1= *vt1 - *vt3;
        cout << "X=" << vt1->X << "  Y=" << vt1->Y << endl;
        delete vt1;
        delete vt2;
        delete vt3;
    }
    
  6. このままでは
    *vt1 = *vt1 + *vt2;
    の演算は出来ても
    *vt1 += *vt2;
    の演算は出来ません。
    *vt1 += *vt2;
    *vt1 -= *vt3;
    の演算が出来るようにバージョンアップして下さい。
    ヒントとして「+=」の演算子をオーバーロードする関数の定義は次のようになります。
    Vector2 &operator+=(Vector2 obj)

超初心者のプログラム入門(C/C++)