他の C 派生言語 (Java や C# など) から C++ に移行すると、C++ にはクラスのメンバーを参照する 3 つの方法a::b
( 、a.b
、および) があることに最初は非常に混乱しますa->b
。これらの演算子のどれをいつ使用しますか?
4 に答える
C++ がクラスまたはクラス オブジェクトのメンバーにアクセスするために使用する 3 つの異なる演算子、つまり二重コロン::
、ドット.
、および矢印->
は、常に明確に定義された 3 つの異なるシナリオに使用されます。これを知っていれば、どのコードを見ても、、、またはをそれぞれ見るだけで、すぐにa
多くのことを知ることができます。b
a::b
a.b
a->b
a::b
b
がクラス (または名前空間) のメンバーである場合にのみ使用されますa
。つまり、この場合a
は常にクラス (または名前空間) の名前になります。a.b
b
がオブジェクトのメンバー (またはオブジェクトへの参照) である場合にのみ使用されますa
。したがって、 fora.b
はa
常にクラスの実際のオブジェクト (またはオブジェクトへの参照) になります。a->b
は、もともとは の略記です(*a).b
。ただし、->
オーバーロードできるメンバー アクセス演算子は のみであるため、 がオーバーa
ロードするクラスのオブジェクトである場合operator->
(このような一般的な型はスマート ポインターとイテレーターです)、その意味はクラス デザイナーが実装したものになります。結論として、 がポインタであるa->b
場合、 はポインタが参照するオブジェクトのメンバーになります。ただし、がこの演算子をオーバーロードするクラスのオブジェクトである場合、オーバーロードされた演算子関数が呼び出されます。a
b
a
a
operator->()
細字:
- C++ では、、、またはとして宣言された
class
型struct
はunion
「クラス型」と見なされます。したがって、上記は3つすべてを指します。 - 参照は意味的にはオブジェクトのエイリアスなので、#3 にも「またはポインタへの参照」を追加する必要がありました。
T*&
ただし、ポインター ( ) への参照はめったに使用されないため、これは役立つというよりも混乱を招くと思いました。 - ドット演算子と矢印演算子は、オブジェクトのメンバーではない場合でも、オブジェクトから静的クラス メンバーを参照するために使用できます。(これを指摘してくれたOliに感謝します!)
ドット演算子は、メンバーを直接選択するシナリオで使用されます。
print(a.b)
ここではb
、 object の直接のメンバーである にアクセスしていますa
。したがって、主にa
オブジェクトでb
あり、のメンバー(関数/変数など)ですa
。
アロー演算子は、間接メンバー選択シナリオで使用されます。
print(a->b)
ここではb
、 が指すオブジェクトのメンバーであるにアクセスしていますa
。これは(*a).b
and の省略形であり、ここでa
は主にオブジェクトへのポインターでb
あり、そのオブジェクトのメンバーです。
二重コロン (スコープ) 演算子は、名前空間に関連する直接メンバー選択シナリオで使用されます。
print(a::b)
ここではb
、クラス/名前空間のメンバーであるにアクセスしていますa
。つまり、主にa
クラス/名前空間でb
あり、のメンバー(関数/変数など)ですa
。