Skip to content

Instantly share code, notes, and snippets.

@onokatio
Last active February 13, 2020 10:58
Show Gist options
  • Save onokatio/adfdbcaa4d7ffd693cc9ff1b4a0f0478 to your computer and use it in GitHub Desktop.
Save onokatio/adfdbcaa4d7ffd693cc9ff1b4a0f0478 to your computer and use it in GitHub Desktop.
C++の演算子オーバーロードの説明
#include <string>
#include <iostream>
// 2次元ベクトルのクラスを作る
class vec {
public:
int e1;
int e2;
const vec operator+(const vec a);
};
// 演算子オーバーロードは、特定のクラスにのみ適用できる
// 今回はvecクラスに対して、+という演算子を定義する
// つまり、a + b は a.+(b)として、
// 左辺のオブジェクトの「+」メソッドへ右辺のオブジェクトが引数として渡されて実行される。
const vec vec::operator+(const vec arg){
vec c;
c.e1 = this->e1 + arg.e1;
c.e2 = this->e2 + arg.e2;
return c;
}
int main(void) {
vec a;
vec b;
vec c;
a.e1 = 1;
a.e2 = 2;
b.e1 = 100;
b.e2 = 200;
c = a + b;
std::cout << c.e1 << std::endl;
std::cout << c.e2 << std::endl;
return 0;
}

演算子オーバーロード

  • 普通の関数は、func(1,2)みたいに、関数名のあとにカッコ、カッコの中に引数を指定する。

  • C++の世界に置いて2項演算子(いわゆる、+とか*)は、「書き方が違うけど+という2つ引数を取る関数に、左右の値を引数として渡している」と考えることもできる

つまり 1 + 2+(1,2)

  • C++の世界では、こういう風に自分で関数を作り、それを記号に割り当てることで、新しい演算子を自分で作れる

  • C++では「オーバーロード」、つまり既にある関数を同じ名前で関数を再定義することで、関数の上書きができる

  • つまり、既にある+-という関数を、数値や小数同士以外の型へ対して自分で定義できる

  • 例えば、+演算子の引数が、数値ではなく大きさ2配列のバージョンを自力で作って、2次元ベクトルの足し算を指せるようなこともできる


厳密には、この説明文には嘘が入っている。演算子オーバーロードは特定のクラスに実装するかたちになる。

つまり、1 + 2+(1,2)ではなく1.+2として呼び出される。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment