C++ でブラケット演算子をオーバーロードする
この簡単なプログラミング ガイドでは、ブラケット ([]
) 演算子をオーバーロードして、クラス オブジェクトの getter および setter にします。
まず、演算子のオーバーロードについて簡単に紹介しましょう。
C++ での演算子のオーバーロード
クラスや構造体などのユーザー定義のデータ型を操作する際に演算子の動作を変更するという考え方は、演算子のオーバーロードとして知られています。 これらは、その演算子が使用されたときに呼び出されるクラスのメンバー関数に似ています。
たとえば、Employees
のクラスのどの従業員が他の従業員よりも高い給与を持っているかを判断したいとします。 >
演算子をオーバーロードして、2つのオブジェクトの salary
データ メンバーを比較し、結果を返すことができます。
演算子のオーバーロードの構文は次のとおりです。
class ClassIdentifier {
[AccessSpecifier] : ReturnType operator OperatorSymbol([list of arguments]) {
// definition
}
};
オプションのアクセス指定子は、できれば public
にする必要があります。 private
にすると、オーバーロード関数はクラス内からしかアクセスできなくなります。
これは通常、ほとんどの場合望ましくありません。
operator
は、演算子のオーバーロードに使用されるキーワードです。 その後、オーバーロードする必要がある演算子のシンボルを指定します。 int、char、float などの基本的なデータ型の演算子をオーバーロードできないことに注意してください。
C++ でブラケット []
演算子をオーバーロードする
[]
ブラケット演算子をオーバーロードして、クラス オブジェクトの値を取得および設定するために使用することもできます。
たとえば、データ メンバーとして配列を持つ MyClass
クラスがあります。 オブジェクトの名前を使用してその配列の要素にアクセスするには、次のように []
ブラケット演算子をオーバーロードできます。
class MyClass {
private:
int arr[5];
public:
int operator[](int i) const { return arr[i]; } // for getting value
int& operator[](int i) { return arr[i]; } // for setting value
};
ユーザーが値を変更できるように、値を設定するために指定されたインデックスへの参照を返したことに注意してください。 次のようにドライバープログラムで使用できます。
int main() {
MyClass obj;
obj[0] = 100; // setting values
obj[1] = 200; // setting values
cout << obj[0] << endl; // getting values
cout << obj[1] << endl; // getting values
return 0;
}
上記の main()
関数で、obj[0] = 100;
の場合 が実行されると、i
への引数として 0
を使用して 2 番目のオーバーロードされた関数を呼び出します。 オーバーロードされたセッター メソッドは、arr
の 0 番目のインデックスのメモリ空間への整数参照を返します。
代入演算子 (=
) の右側の値が、返された場所に代入されるようになりました。 したがって、obj
のデータ メンバの 0 番目のインデックスには、100
の値が与えられます。
上記のコード片を 1つの完全な実行可能プログラムに結合しましょう。
#include <iostream>
using namespace std;
class MyClass {
private:
int arr[5];
public:
int operator[](int i) const { return arr[i]; } // for getting value
int& operator[](int i) { return arr[i]; } // for setting value
};
int main() {
MyClass obj;
obj[0] = 100; // setting values
obj[1] = 200; // setting values
cout << obj[0] << endl; // getting values
cout << obj[1] << endl; // getting values
return 0;
}
出力:
100
200