->
これは本当に難しいものです。これは、非静的メンバー関数でなければならず、引数をとらない。戻り値は、メンバー検索を実行するために使用されます。
戻り値がポインタではなくクラス型の別のオブジェクトである場合、後続のメンバー参照もoperator->
関数によって処理されます。これを「ドリルダウン動作」といいます。最後のものがポインタを返すまで、言語は一緒にoperator->
を呼び出します。
struct client
{ int a; };
struct proxy {
client *target;
client *operator->() const
{ return target; }
};
struct proxy2 {
proxy *target;
proxy &operator->() const
{ return * target; }
};
void f() {
client x = { 3 };
proxy y = { & x };
proxy2 z = { & y };
std::cout << x.a << y->a << z->a; // print "333"
}
->*
それについて何も特別なことがないという点で、この1つは唯一のトリッキーです。 オーバーロードされていないバージョンでは、左側にクラス型へのポインタオブジェクトが、右側にメンバタイプへのポインタオブジェクトが必要です。しかし、あなたがそれをオーバーロードすると、好きな引数を取ってあなたが望むものを返すことができます。それは非静的メンバーである必要はありません。
つまり、+
,-
、および/
のような通常の2進演算子です。参照:Are free operator->* overloads evil?
.*
と.
これらがオーバーロードすることはできません。左辺がクラス型の場合には、既に組み込みの意味があります。おそらく、左側のポインタのためにそれらを定義できるのは少し意味があるかもしれませんが、言語設計委員会はそれが有用であるよりも混乱すると判断しました。 ->
、->*
、.
をオーバーロード
、および.*
のみ式が未定義ことになる場合に記入することができ、それがオーバーロードしない有効だろう表現の意味を変更することはできません。
私は上記Qで質問されたすべてのQ ++を信じていると信じています。 –
'operator'の' const'と ''const'のバージョンは*必須*ではありませんが、有用。 –
も参照してください:http://yosefk.com/c++fqa/operator.html –