C++ での添え字演算子のオーバーロード

胡金庫 2023年10月12日
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 修飾。

著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Operator