C++におけるドット演算子(.)とアロー演算子(->)の違いを徹底解説
C++では、ドット演算子(.)とアロー演算子(->)はどちらもクラスのメンバーにアクセスするために使用されますが、それぞれ使用される場面が異なります。C++において、class、struct、unionとして宣言された型はすべて「クラスタイプ」とみなされるため、以下の説明はこれら3つすべてに当てはまります。
基本的な使い分け
- a.b は、b がオブジェクト a(またはオブジェクトへの参照[1])のメンバーである場合にのみ使用できます。つまり、
a.bの形式では、a は常にクラスの実際のオブジェクト(またはその参照)でなければなりません。 - a->b は、本質的に
(*a).bの省略記法です。つまり、a がオブジェクトへのポインタである場合、a->bは「a が指し示すオブジェクトのメンバー b」にアクセスすることを意味します。
オーバーロードの可否について
重要な注意点として、ドット演算子(.)はオーバーロードできません。一方、アロー演算子(->)はオーバーロード可能な演算子であり、operator->() を定義することで、この演算子が使用された際に呼び出される独自の処理を実装できます。
したがって、a が operator-> をオーバーロードしたクラスのオブジェクトである場合、その動作はクラス設計者が実装した内容に依存します。このような型の代表例としては、スマートポインタやイテレータが挙げられます。
[1] 参照は意味的にはオブジェクトの別名(エイリアス)であるため、「ポインタへの参照」の場合も同様のことが言えます。ただし、ポインタへの参照(T*&)は実務でほとんど使用されないため、ここでは詳細な説明を省略しています。
サンプルコード
#include<iostream>
class A {
public:
int b;
A() { b = 5; }
};
int main() {
A a = A();
A* x = &a;
std::cout << "a.b = " << a.b << "\n";
std::cout << "x->b = " << x->b << "\n";
return 0;
}実行結果
このプログラムを実行すると、以下の出力が得られます。
a.b = 5 x->b = 5
このように、オブジェクト本体に対してはドット演算子を、オブジェクトへのポインタに対してはアロー演算子を使用することで、同じメンバーにアクセスできることが確認できます。
-
C#のインターフェイスとクラスの違いとは?わかりやすく解説
C#におけるインターフェイスは、フィールドやメソッドの実装を持たない「宣言のみ」の型です。つまり、自分で定義したメソッドの中身(処理内容)を実装することはできません。一方、クラスは通常、インターフェイスで宣言されたメソッドを実際に実装する役割を担います。インターフェイスとはインターフェイスは、プロパティ・メソッド・イベントといったメンバーを定義しますが、含まれるのは宣言のみです。各メンバーの具体的な処理をどう実装するかは、そのインターフェイスを実装する派生クラスの責任となります。C#ではクラスの多重継承がサポートされていないため、代わりに複数のインターフェイスを実装することで、異なる機能を柔軟
-
Pythonの「=」と「==」の違いとは?代入と比較の使い分けを徹底解説
Pythonにおける「=」と「==」の基本的な違いPythonでは「=」と「==」はまったく異なる役割を持つ記号です。初心者が混同しやすいポイントですが、それぞれの意味を正しく理解しておくことが重要です。「=」は代入演算子Pythonにおいて「=」記号は代入演算子として定義されています。左辺には1つの変数を、右辺には式を置く必要があり、右辺の式が評価された結果の値が、左辺の変数に格納されます。つまり、式と変数名は入れ替えて使うことはできません。>>> a=10 >>> b=20 >>> c=a+b >>> a,b,c (1