他の C 派生言語 (Java や C# など) から C++ に移行すると、C++ にはクラスのメンバーを参照する方法が 、 、 の 3 つあることが最初は非常にわかりにくいですa::b
。a.b
これらa->b
の演算子のどれをいつ使用すればよいのでしょうか。
(注:これはStack Overflow の C++ FAQこの形式でFAQを提供するというアイデアを批判したい場合は、このすべてを始めたのはメタへの投稿だったそれをする場所になるでしょう。その質問への回答は、C++ チャットルーム、FAQ のアイデアが最初に生まれた場所なので、あなたの回答はそのアイデアを思いついた人たちに読まれる可能性が非常に高くなります。
ベストアンサー1
C++ がクラスまたはクラス オブジェクトのメンバーにアクセスするために使用する 3 つの異なる演算子、つまり二重コロン::
、ドット.
、矢印は、常に明確に定義された 3 つの異なるシナリオで使用されます。これを知っていれば、どのコードでも、、、またはをそれぞれ見るだけで、および->
について多くのことをすぐに理解できるようになります。a
b
a::b
a.b
a->b
a::b
b
は、クラス (または名前空間) のメンバーである場合にのみ使用されますa
。つまり、この場合はa
常にクラス (または名前空間) の名前になります。a.b
b
は、 がオブジェクト (またはオブジェクトへの参照) のメンバーである場合にのみ使用されますa
。したがってa.b
、の場合、a
は常にクラスの実際のオブジェクト (またはオブジェクトへの参照) になります。a->b
は、もともと の省略記法です(*a).b
。ただし、 は->
オーバーロード可能なメンバー アクセス演算子の唯一のものなので、 がa
オーバーロードするクラスのオブジェクトである場合operator->
(一般的なこのような型はスマート ポインターとイテレータです)、その意味はクラス設計者が実装したものになります。まとめると、 では、がポインターであるa->b
場合、はポインターが参照するオブジェクトのメンバーになります。ただし、 がこの演算子をオーバーロードするクラスのオブジェクトである場合、オーバーロードされた演算子関数が呼び出されます。a
b
a
a
operator->()
注意事項:
- C++ では、、、またはとして宣言された型は
class
「struct
クラスunion
型」とみなされます。したがって、上記はこれら 3 つすべてを指します。 - 参照は意味的にはオブジェクトへのエイリアスなので、#3 にも「またはポインタへの参照」を追加すべきでした。しかし、ポインタ (
T*&
) への参照はほとんど使用されないため、これは役に立つというよりは混乱を招くだろうと思いました。 - ドット演算子と矢印演算子を使用すると、オブジェクトのメンバーではない静的クラス メンバーを参照できます。(この点を指摘してくれた Oli に感謝します)