演算子のオーバーロード
今までにSTLとか使ってると「.」を押したときに候補としていくつか出てくると思うんですが、その中に「operator=」とかあったと思うんですよ。
正直わけわかんなかったので放置してたんですが、それが演算子のオーバーロードっていうものだそうだ。
ということで、それの使い方と意味を確認するため備忘録。
コード
先にコードを出してみます。
#include <iostream>
class A
{
private:
int num;
public:
A(const int num) :num(num)
{
}
~A()
{
}
friend A operator+(const A& a, const A& b)
{
return (a.num + b.num);
}
int Get() const { return num; }
};
int main()
{
A a = A(10);
A b(20);
A result = a + b;
std::cout << result.Get() << std::endl;
return 0;
}
これは、クラス変数を加算したらそのメンバ変数であるnumを加算するようになっているというわけではないです。試しに変数を一つ追加します。
#include <iostream>
class A
{
private:
int num;
int ID;
public:
A(const int num, const int ID) :num(num), ID(ID)
{
}
~A()
{
}
friend A operator+(const A& a, const A& b)
{
return A(a.num + b.num, a.ID + b.ID);
}
int Get() const { return num; }
int GetID() const { return ID; }
};
int main()
{
A a = A(10, 0);
A b(20, 1);
A result = a + b;
std::cout << result.Get() << "\t" << result.GetID() << std::endl;
return 0;
}
先ほどのコードではわざと書きませんでしたが、return のところでAと使っています。まぁ分かり切った話ですが、関数の方がクラスAなので、コンストラクタに合うようにするためこのように変化しました。
で、numの加算だけを返したいもの作りたいならこのようにすればいいだけです。
#include <iostream>
class A
{
private:
int num;
int ID;
public:
A(const int num, const int ID) :num(num), ID(ID)
{
}
~A()
{
}
friend int operator+(const A& a, const A& b)
{
return (a.num + b.num);
}
int Get() const { return num; }
int GetID() const { return ID; }
};
int main()
{
A a = A(10, 0);
A b(20, 1);
int result = a + b;
std::cout << result << std::endl;
return 0;
}
ただし、演算子のオーバーロードは一つの型しか作れず、int型の後にクラスA型は作ることが出来ません。
で、ここまでfriendをあたかも慣れ親しんだかのように使いましたが、当方一切理解していないのでこれから学習します。