2項演算子のオーバーロード
C++では"+"や"-"といった演算子のオーバーロードが可能です。これを使うと以下のようなオブジェクト同士の足し算や引き算の動作を規定することができます。
Kitten *mii = new Kitten(); Kitten *tora = new Kitten(); *mii + tora; // オブジェクト同士を足す。
- 演算子をオーバーロードするには、クラスに「<戻り値> operator<演算子>(<引数>)」というメソッドを定義します。
- 引数の型には任意の型を指定できます。引数の型を変えて、同じ演算子を複数個オーバーロードすることも可能です。
- 引数の数は1or0です。複数の引数を持つことはできません。
- 戻り値にも任意の型を指定できます。
#include <iostream> // クラス定義 class Kitten { int age; public : Kitten( int age ); int getAge(); // 2項演算子のオーバーロード Kitten* operator+( Kitten *k ); Kitten* operator+( int i ); // 引数がintのもの。// 引数が違うためオーバーロードできる。 int operator-( int i ); // 戻り値もKittenである必要はない。 void operator-( ); // 引数、戻り値なしもOK // int operator-( int i, int j ); // 引数2つはエラー。 }; Kitten::Kitten( int age ) { this->age = age; } int Kitten::getAge() { return this->age; } Kitten *Kitten::operator+( Kitten *k ) { this->age += k->getAge(); return this; } Kitten *Kitten::operator+( int i ) { this->age += i; return this; } int Kitten::operator-( int i ) { this->age -= i; return this->age; } void Kitten::operator-( ) { this->age -= 1; } // メイン関数 int main() { Kitten* mii = new Kitten( 1 ); Kitten* tora = new Kitten( 2 ); Kitten* shiro = *mii + tora; std::cout << shiro->getAge() << std::endl; // 3 shiro = *mii + 10; std::cout << shiro->getAge() << std::endl; // 13 std::cout << (*mii) - 5 << std::endl; // 8 -(*mii) ; std::cout << mii->getAge()<< std::endl; // 7 delete mii; delete tora; return 0; }
実行結果です。
3 13 8 7