重複の可能性:
演算子のオーバーロード
メンバーアクセス演算子->をオーバーロードして、データメンバーまたはその他の変数へのポインターを返すことができます。
この機能はどこで使用されますか?それはどのようなコーディングの問題を解決しますか、あるいはそれは何を容易にしますか?
重複の可能性:
演算子のオーバーロード
メンバーアクセス演算子->をオーバーロードして、データメンバーまたはその他の変数へのポインターを返すことができます。
この機能はどこで使用されますか?それはどのようなコーディングの問題を解決しますか、あるいはそれは何を容易にしますか?
メンバーアクセス演算子はやや奇妙な生き物です。これは、メンバーアクセス演算子がオーバーロードされたポインターまたはクラスを返すことを目的としています。ポインタに到達すると、対応するメンバーにアクセスするだけです。メンバーアクセス演算子のオーバーロードの主な用途は、スマートポインター、たとえば、std::shared_ptr<T>
ですstd::unique_ptr<T>
。この演算子がないと、次のようなものを使用する必要があります
sp.get()->member
また
(*sp).member
それ以外の
sp->member
「オーバーライド」と「オーバーロード」の両方の用語は非常に誤解を招くことに注意してください。正規演算子は、ポインターを介して参照さ->
れるオブジェクトのメンバーにアクセスします。つまり、ポインター型(より正確にはrawポインターX* x; x->foo;
)が指すオブジェクトにアクセスします。x
ただし、operator->
集約型(つまり「クラス」)で非静的メンバー関数として実装できることは、別のことを行います。ではX* x; x->foo;
、まだ正規構造演算子であり、変更->
することはできません。ただし、では、のメンバー関数を呼び出します。1つの演算子は生のポインター型にのみ適用でき、もう1つの演算子は非ポインター型にのみ適用できるため、この一見小さな区別は非常に重要です。Y y; y->foo
->
operator->
Y
これは通常、タイプが構文的に振る舞うことを可能にするために使用されますshared_ptr
。これは、この言語サポートなしでは達成できず、適用可能な(ただしではない)正規演算子を模倣することが許可されていない場合は同じ方法で使用できませんでしshared_ptr<X>
た。X*
shared_ptr<X>::operator->
->
X*
X
ポインタをモデリングしていて、便宜上通常の構文を維持したい場合。std::unique_ptrとstd::shared_ptrを見てください。:)