C++ での添え字演算子のオーバーロード
この記事では、C++ で添え字/インデックス演算子をオーバーロードする方法を示します。
C++ で operator[]
表記を使用して添え字演算子をオーバーロードする
演算子のオーバーロードは、C++ 言語の強力な機能です。これにより、プログラマーは、ユーザー定義クラスの既存の演算子の意味を再定義することができます。基本的に、オーバーロードされた演算子は関数であり、特別な名前があることを除いて、そのように定義されます。名前は、接頭辞 operator
で始まり、その後にオーバーロードされている演算子記号が続く必要があります。
一般に、演算子のオーバーロード関数には、指定された演算子のオペランドと同じ数のパラメーターがあります。したがって、添え字演算子のオーバーロードは 2つのパラメーターを受け入れます。次のサンプルコードは、内部の vector
構造体で要素アクセス操作を実行し、要素への参照を返す operator[]
メンバー関数を持つ MyClass
クラスの実装を示しています。MyClass
は基本的に std::vector
コンテナのラッパークラスであり、デモンストレーションのためにいくつかのメンバー関数を提供します。
operator[]
メンバー関数には、通常の添え字演算子として 1つのパラメーターがあることに注意してください。ただし、演算子関数がメンバー関数として宣言されている場合、暗黙の this
ポインターにバインドされた最初のパラメーターがあります。したがって、メンバー関数として宣言された演算子のオーバーロードのオペランドよりもパラメーターを 1つ少なくすることができます。
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
template <typename T>
class MyClass {
public:
MyClass() = default;
explicit MyClass(const T &data) { vec.push_back(data); };
MyClass(std::initializer_list<T> list) {
vec.insert(vec.end(), list.begin(), list.end());
};
void push_back(const T &data) { vec.push_back(data); };
void pop_back() { vec.pop_back(); };
size_t size() { return vec.size(); };
T &operator[](size_t pos) { return vec.at(pos); };
const T &operator[](size_t pos) const { return vec.at(pos); };
private:
vector<T> vec;
string name;
};
int main() {
MyClass<string> m1 = {"top", "mop", "gop", "sop"};
for (size_t i = 0; i < m1.size(); ++i) {
cout << m1[i] << endl;
}
cout << "/ ------------------- /" << endl;
m1.pop_back();
m1.pop_back();
for (size_t i = 0; i < m1.size(); ++i) {
cout << m1[i] << endl;
}
return EXIT_SUCCESS;
}
出力:
top
mop
gop
sop
/ ------------------- /
top
mop
一部の演算子はメンバー関数としてオーバーロードする必要があり、そのうちの 1つは添え字演算子であることに注意してください。operator[]
関数は、指定された位置で要素を取得する組み込み演算子と同様の意味を持つことをお勧めします。下付き文字のオーバーロードは、割り当ての両側で使用される参照を返す必要があります。operator[]
関数の 2つのバージョンを定義することも重要です。1つは非 const
オブジェクト用で、もう 1つは const
オブジェクト用です。オブジェクト自体が const
修飾。