添え字演算子 [] がオーバーロードされているクラスの配列
二次元配列と同じで、添え字の順番を間違えたら大変な事になります。
(かけ算九九の表なら、値は変わらないかもしれませんが。)
たとえばSTLのvectorそのものの配列はどうなのか。
これで一目瞭然です。
std::vector<int> v[3]; v[1].push_back(99); // 今プッシュした99を表示する std::cout << v[1][0] << '\n';
最初のでどの要素を使うかの指定し、
その次のはvectorの添え字演算子を呼び出しているんだと思います。
よくよく考えれば当たり前なのかもしれませんが。
vectorの存在を忘れてて自分で書いたテストコード
無駄な労力を使ってしまったので、これも載せておきます。
/* * 添え字演算子をオーバーロードしてみたクラスの配列のテスト。 * (添え字の順番がわからない。) */ #include <iostream> using namespace std; /* * Test class */ class Test { private: int i; // 何かのデータ public: // コンストラクタ Test( int _i = 0) : i(_i) {} // []演算子のオーバーロード int &operator[]( int worm) { // 引数のwormは無視して、iへの参照を返す。 // (添え字らしい動作をしないけどテストだから。) return this->i; } }; /* * Main */ int main() { // 添え字が300だろうと400だろうと、とにかくiへの参照を返す Test obj = 20; cout << obj[300] << '\n'; // 以下が本命。Testの配列。 Test array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; cout << array[2][5] << '\n'; // 何が表示されるでしょうか? 2? 5? return 0; }
08/12/02 追記
もう少し納得のいきそうな説明もできます。
// 注:MyClassは添え字演算子がオーバーロードされているとする。 vector<MyClass> v(10); // 前もって10個分確保 v[2][3] = 10;
これがどんな仕事をするのかは脳内補完してください。
上記のコードは以下のものと同じです。
vector<MyClass> v(10); // 前もって10個分確保 v.operator[](2).operator[](3) = 10;
このコードとそのコメント以上の説明は必要ないと思ったりしてますが、
要はvectorのoperatorを呼び出したらMyClass型のオブジェクトが得られて、
そのオブジェクトに対し、operatorを呼び出してると。
多分そんな感じ。