0Pricing
C++ Academy · レッスン

添字演算子と関数呼び出し演算子

[]と()をオーバーロードし、型をコンテナや呼び出し可能オブジェクトのように動作させます。

「添字演算子と関数呼び出し演算子」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

operator[] — インデックスアクセス

[]をオーバーロードして、型を配列のように使えるようにします。コンテナ、行列、画像クラスなどで便利です。

class Vec {
    std::vector<double> data_;
public:
    double& operator[](size_t i) { return data_[i]; }
    double  operator[](size_t i) const { return data_[i]; }
};

2つのオーバーロード:constと非const

両方を用意します。constインスタンスに対する呼び出しはconstオーバーロードに解決され、非const版では代入が可能になります。

範囲チェック

通常のoperator[]は、慣例上、範囲チェックを行いません。標準ライブラリと同様に、例外を投げる別のat()メソッドを用意します。

double& at(size_t i) {
    if (i >= data_.size()) throw std::out_of_range("");
    return data_[i];
}

多次元の添字(C++23)

C++23では、カンマ区切りの添字が追加されました:m[i, j]。それ以前のバージョンでは、関数呼び出しまたは添字の連鎖が必要です。

// C++23
double& operator[](size_t i, size_t j);

// Pre-C++23 workaround
double& operator()(size_t i, size_t j);

operator() — 関数呼び出し

()をオーバーロードして、インスタンスを呼び出し可能にします。ファンクター、行列のインデックスアクセス、設定可能な述語などに使用します。

struct Square {
    int operator()(int x) const { return x * x; }
};

Square sq;
std::cout << sq(5);   // 25

状態を持つファンクター

関数呼び出し演算子はメンバー変数と組み合わせて、状態を持つ呼び出し可能オブジェクトとして機能します。

struct GreaterThan {
    int threshold;
    bool operator()(int x) const { return x > threshold; }
};

GreaterThan over10{10};
std::cout << over10(15);   // true

STLアルゴリズムでの使用

関数の代わりに、ファンクターのインスタンスをアルゴリズムに渡します。

std::vector<int> v = {1, 11, 2, 22};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});

複数引数の演算子

C++23より前の[]と()は、どちらも任意の数の引数でオーバーロードできます。C++23より前に行列のようなアクセスを実現する場合は、()のほうが柔軟です。

参照を返す場合と値を返す場合

添字を通じた代入を可能にするには、参照を返します。読み取り専用の型では、値を返します。

プロキシオブジェクト

operator[]からビットフィールドのような複雑なオブジェクトを返す必要がある場合は、変換演算子と代入演算子を備えた小さなプロキシクラスを返します。

実際の使用例

一般的な用途:

  • std::vector::operator[]
  • std::map::operator[] — キーがない場合は挿入します
  • 行列クラス:m(i, j)
  • アルゴリズム用のファンクター

簡単な確認

クラスのインスタンスを関数のように呼び出せるようにするには、どうすればよいですか?

まとめ

インデックスアクセスには[]をオーバーロードします(constと非constのオーバーロードを用意します)。()をオーバーロードすると、インスタンスを呼び出し可能にできます。これはファンクターやラムダ式の基礎となります。

よくある質問

「添字演算子と関数呼び出し演算子」レッスンは無料ですか?

はい。「添字演算子と関数呼び出し演算子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「添字演算子と関数呼び出し演算子」で何を学びますか?

[]と()をオーバーロードし、型をコンテナや呼び出し可能オブジェクトのように動作させます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「添字演算子と関数呼び出し演算子」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 算術演算子と比較演算子
  2. ストリーム挿入演算子と抽出演算子
  3. 添字演算子と関数呼び出し演算子
  4. 三方比較演算子(C++20)
← C++ Academyに戻る