- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:添字演算子)
添字演算子
このQ&Aのポイント
- #include <iostream>\n\nclass hoge{\n\tprivate:\n\t\tint a;\n\tpublic:\n\t\thoge(){\n\t\t\ta = 0;\n\t\t}\n\n\t\tint operator+(int fuga){\n\t\t\ta = a + fuga;\n\t\t\treturn a;\n\t\t}\n\n\t\tint operator[](int fuga){\n\t\t\treturn 1;\n\t\t}\n};\n\nint main(){\n\thoge* p;\n\tp = new hoge;\n\tstd::cout << ((*p) + 5) << std::endl;\n\tstd::cout << ((*p)[1] ) << std::endl;\n\t\n\t// 5\n\t// 1\n\n\t// std::cout << ((*p) [] 1); エラーです。何故ですか?\n}
- C++の添字演算子について質問です。\n\nこのコードでは、hogeクラス内に+演算子と、[]演算子のオーバーロードが定義されています。+演算子はaにfugaを足し合わせた結果を返し、[]演算子は常に1を返します。\n\nmain関数では、hogeクラスのインスタンスを作成し、そのインスタンスの+演算子と[]演算子を利用して値を取得しています。+演算子には引数として5を渡しており、[]演算子には引数として1を渡しています。\n\nその後、取得した値を出力しています。出力結果は「5」「1」となります。\n\nしかし、最後のコメントアウトされた行、「std::cout << ((*p) [] 1);」がエラーになってしまいます。何故エラーが発生するのでしょうか?
- この質問では、C++の添字演算子について説明します。\n\nコードでは、hogeクラスに+演算子と[]演算子のオーバーロードが定義されています。+演算子はaにfugaを足し合わせた結果を返し、[]演算子は常に1を返します。\n\nmain関数では、hogeクラスのインスタンスpを作成し、そのインスタンスの+演算子で5を足し合わせて値を取得し、[]演算子で1を取得しています。\n\nしかし、最後の行、「std::cout << ((*p) [] 1);」はエラーになります。これは、[]演算子の使用方法が誤っているためです。[]演算子はインデックスを指定して要素にアクセスするための演算子ですが、[]の後に値を指定する必要があります。値を指定しないとエラーが発生します。\n\n以上が、なぜエラーが発生するのかの説明です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>// std::cout << ((*p) [] 1); エラーです。何故ですか? 定義された構文に従ってないから。 関数的に呼び出したいのなら (*p).operator[](1) とか。
お礼
みたいね。 どうやら int operator +(int fuga){ return 1; } という定義が使えるようなので int operator mod(int fuga){ return 1; } とか書いたら エラー E2076 hoge.cpp 15: オーバーロード可能な演算子が必要 って言われたから
補足
あれ?独自の演算子を定義できる方法だと思ったけど, int operator$(int fuga){ a = a + fuga; return a; } とかやったら コンパイルエラーだ(汗 #もしかして規格側で定義された演算子をオーバーロードできるだけで 独自の演算子を書いたり出来ない?(汗 #そうであれば、「規格でそうなっている」で納得することにするけど。 ##っつーのも ## $$演算子とかを俺が定義した場合 ## $1$と $$ 1 のどちらの演算子を定義したことになるのかなーと思ったから。 ## もし記述方法によって書き換えられるとしたら,C++の元になっている ## Cはどういう構造の違いを与えているのかなーと。