C++演算子のオーバーロード
演算子の多重定義(オーバーロード: Overload)
operatorについて
C++では演算子の動作は「演算子関数」で定義されるため、演算子の多重定義が可能となります。
演算子のオーバーロードには「operator」キーワードを用います。
戻り値の型 operator オーバーロードする演算子 ( parameter-list )
例えば、「A+B」は「A.operator+(B)」という演算子になります。
さらに、フレンド関数を利用すれば「operator+(A,B)」と表現することができます。
単項演算子のオーバーロード
単項演算子のオーバーロードは、単項演算子の右辺にあるオブジェクトが引数として渡されます。
例えば、「obj1 = obj2;」という式の「=」をオーバーロードした時は、「obj1.=(obj2);」という意味になります。
#include <iostream>
using namespace std;
//単項演算子のオーバーロード
class Overload{
private:
int buff_;
public:
Overload(int data) :buff_(data){}; // コンストラクタ
~Overload(){}; // デストラクタ
int print(){ return(buff_); }
// 代入
Overload& operator=(const Overload &obj)
{
buff_ = obj.buff_;
return(*this);
}
// インクリメント
void operator++(int)
{
buff_++;
return;
}
// デクリメント
void operator--()
{
--buff_;
return;
}
};
int main()
{
Overload obj1(5);
Overload obj2(7);
obj1 = obj2;
cout << "= : " << obj1.print() << endl;
obj1++;
cout << "++ : " << obj1.print() << endl;
--obj1;
cout << "-- : " << obj1.print() << endl;
return(0);
}
2項演算子のオーバーロード
2項演算子のオーバーロードは、演算子の右辺が引数として渡され、左辺オブジェクトのオーバーロードした演算子が呼び出されます。
#include <iostream>
using namespace std;
class Overload
{
private:
int buff;
public:
Overload(int data) :buff(data) {};
~Overload(){};
int print(){ return(buff); }
//2項演算子のオーバーロード
int operator+(const Overload &obj){
return(buff + obj.buff);
}
int operator-(const Overload &obj){
return(buff - obj.buff);
}
int operator*(const Overload &obj){
return(buff * obj.buff);
}
int operator/(const Overload &obj){
return(buff / obj.buff);
}
int operator%(const Overload &obj){
return(buff % obj.buff);
}
};
int main(int argc, char** argv)
{
int data = 0;
Overload obj1(17);
Overload obj2(5);
data = obj1 + obj2;
cout << "data = " << data << endl;
data = obj1 - obj2;
cout << "data = " << data << endl;
data = obj1 * obj2;
cout << "data = " << data << endl;
data = obj1 / obj2;
cout << "data = " << data << endl;
data = obj1 % obj2;
cout << "data = " << data << endl;
return(0);
}
配列添え字演算子のオーバーロード
配列添え字である以下の表現は、
A[5]
オーバーロードすることで、以下の演算子関数として表現できます。
A.operator[](5);
関連ページ
- C++のファイル作成と実行
- 関数
- 名前空間
- 参照型
- 動的メモリ割り当て
- キャスト
- 例外処理
- クラス
- コンストラクタとデストラクタ
- 継承
- ポリモーフィズム
- テンプレート
- STL
- 文字列操作
- 演算子のオーバーロード