usagi / virtual-keyboard-prototype-1

仮想キーボード試作1型
3 stars 0 forks source link

reciever.cxx、61行目について #4

Closed arisin closed 10 years ago

arisin commented 10 years ago

recieve(vm["port"].as());

[]の使い方について知りたいです。 よろしくお願いします。

usagi commented 10 years ago

実はこれ、「演算子オーバーロード」。

C++ではクラスを定義した時に、そのクラスのオブジェクトに対して「演算子」が適当される場合の挙動(実はただの関数呼び出し)を自由に定義できます。

「演算子オーバーロード」できる演算子で、もっとも身近でわかりやすいのは operator+() だと思いますので、先ずはその例を示します。

http://melpon.org/wandbox/permlink/3o2aeE1WrlNaNKJu

続いて、 operator[]()のサンプルも書きます。

arisin commented 10 years ago

サンプル11行目、hoge operator+(hoge target)のtargetというのは決まり文句でしょうか?? 初歩的ですみません。よろしくお願いします。

usagi commented 10 years ago

operator[]をオーバーロードする例を書きました。

http://melpon.org/wandbox/permlink/XhtzxPu46LZfAScq

いっしょにdouble operator[](int)と同じ効果のfouble f(int)も書いておいたので、「なんだ、ただの関数呼び出しをかっこよく演算子とかでできるようにしてるだけの機能なのね」ということが分かるかも知れません。

usagi commented 10 years ago

演算子オーバーロードの文法としては、それがふつーに名前を付ける関数じゃなくて、どの演算子を関数として定義するよ、という事を書く必要があります。

そこで、きほんは

「戻り値の型」 operator「演算子」(仮引数の型1 仮引数1のシンボル名, 仮引数の型2 仮引数2のシンボル名 ...)
{
  「任意の処理」
  return 「戻り値」; // void関数じゃない場合は必要ですね
}

となります。

usagi commented 10 years ago

operatorというのが関数名を書くべきところに出現した場合、それは通常の名前を付けた関数じゃなくて、何らかの演算子を演算子オーバーロードとしてクラスに定義したいんだ、という事でコンパイラーが解釈してくれる仕組みです。

usagi commented 10 years ago

オーバーロードできる演算子は、演算子らしきものほぼすべてで、

などに始まり、凡そC++で通常演算子として使えるものは全て独自に作ったクラス用にも演算子オーバーロードを定義できると思って構いません。

ちなみに std::vector にも operator[] があります。

http://www.cplusplus.com/reference/vector/vector/operator[]/

これも演算子オーバーロードによって、std::vector型のオブジェクトに対して hoge[123] とかやると内部で保持しているインデックス123番目の値を返すという挙動が実装されていて、それで使えるんです。

usagi commented 10 years ago

hoge["mojimoji"]ってするタイプのoperator[]のサンプルも書いてみました。簡単なゲーム機メーカーとゲーム機の辞書を実現する例です。

http://melpon.org/wandbox/permlink/0YXjHueKL9SmPHPv

こんなふうに、実際問題ただの関数呼び出しなのですが、演算子として記号で呼び出せる事で便利にしよう、というのが演算子オーバーロードの目的となります。