Closed arisin closed 10 years ago
実はこれ、「演算子オーバーロード」。
C++ではクラスを定義した時に、そのクラスのオブジェクトに対して「演算子」が適当される場合の挙動(実はただの関数呼び出し)を自由に定義できます。
「演算子オーバーロード」できる演算子で、もっとも身近でわかりやすいのは operator+() だと思いますので、先ずはその例を示します。
http://melpon.org/wandbox/permlink/3o2aeE1WrlNaNKJu
続いて、 operator[]()のサンプルも書きます。
サンプル11行目、hoge operator+(hoge target)のtargetというのは決まり文句でしょうか?? 初歩的ですみません。よろしくお願いします。
operator[]をオーバーロードする例を書きました。
http://melpon.org/wandbox/permlink/XhtzxPu46LZfAScq
いっしょにdouble operator[](int)
と同じ効果のfouble f(int)
も書いておいたので、「なんだ、ただの関数呼び出しをかっこよく演算子とかでできるようにしてるだけの機能なのね」ということが分かるかも知れません。
演算子オーバーロードの文法としては、それがふつーに名前を付ける関数じゃなくて、どの演算子を関数として定義するよ、という事を書く必要があります。
そこで、きほんは
「戻り値の型」 operator「演算子」(仮引数の型1 仮引数1のシンボル名, 仮引数の型2 仮引数2のシンボル名 ...)
{
「任意の処理」
return 「戻り値」; // void関数じゃない場合は必要ですね
}
となります。
operator
というのが関数名を書くべきところに出現した場合、それは通常の名前を付けた関数じゃなくて、何らかの演算子を演算子オーバーロードとしてクラスに定義したいんだ、という事でコンパイラーが解釈してくれる仕組みです。
オーバーロードできる演算子は、演算子らしきものほぼすべてで、
operator +
operator -
operator *
operator /
などに始まり、凡そC++で通常演算子として使えるものは全て独自に作ったクラス用にも演算子オーバーロードを定義できると思って構いません。
ちなみに std::vector にも operator[] があります。
http://www.cplusplus.com/reference/vector/vector/operator[]/
これも演算子オーバーロードによって、std::vector型のオブジェクトに対して hoge[123] とかやると内部で保持しているインデックス123番目の値を返すという挙動が実装されていて、それで使えるんです。
hoge["mojimoji"]
ってするタイプのoperator[]のサンプルも書いてみました。簡単なゲーム機メーカーとゲーム機の辞書を実現する例です。
http://melpon.org/wandbox/permlink/0YXjHueKL9SmPHPv
こんなふうに、実際問題ただの関数呼び出しなのですが、演算子として記号で呼び出せる事で便利にしよう、というのが演算子オーバーロードの目的となります。
recieve(vm["port"].as());
[]の使い方について知りたいです。 よろしくお願いします。