C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のアロー演算子(矢印演算子)とは?ドット演算子との違いをわかりやすく解説

C++には、クラスのメンバーにアクセスするための演算子として「ドット演算子(.)」と「アロー演算子(->)」の2種類があります。どちらも同じ目的で使われますが、使用する場面が異なります。

C++では、classstructunionとして宣言された型はすべて「クラスタイプ」とみなされます。以下の説明は、これらすべてに共通して当てはまります。

ドット演算子とアロー演算子の基本的な違い

  • a.b は、b がオブジェクトa(またはオブジェクトへの参照)のメンバーである場合にのみ使用できます。つまり、a.b の形式では、a は必ず実際のオブジェクト(またはオブジェクトへの参照)になります。
  • a->b は、本質的に (*a).b の省略記法です。a がオブジェクトへのポインターである場合、a->b はそのポインターが指し示すオブジェクトのメンバー b にアクセスすることを意味します。

演算子のオーバーロードに関する注意点

重要なポイントとして、ドット演算子(.)はオーバーロードできません。一方、アロー演算子(->)はオーバーロード可能な演算子であり、operator->() という関数を独自に定義することができます。

したがって、a が operator-> をオーバーロードしているクラスのオブジェクトである場合、その動作はクラス設計者が実装した内容に依存します。代表的な例としては、スマートポインターやイテレーターなどが挙げられます。これらの型は、通常のポインターと同じ構文で扱えるようにするために 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;
}

出力結果

このプログラムを実行すると、次の出力が得られます。

5
5

オブジェクト変数 a に対してドット演算子を使った場合と、ポインター x に対してアロー演算子を使った場合の両方で、同じ値(5)にアクセスできていることが確認できます。

まとめ

使い分けの基本ルールはシンプルです。オブジェクトそのもの(または参照)にはドット演算子(.)を、オブジェクトへのポインターにはアロー演算子(->)を使用します。また、スマートポインターのような独自クラスでは operator-> をオーバーロードすることで、生のポインターと同様の直感的な構文を実現できる点も覚えておくと良いでしょう。

  1. C++のsizeof演算子とは?基本構文と使い方を実例付きで解説

    sizeof はC++のキーワードであると同時に、コンパイル時に評価される演算子でもあります。変数やデータ型が必要とするメモリのサイズをバイト単位で取得するために使用され、プログラムの実行時ではなくコンパイルの時点でその値が確定する点が特徴です。sizeof演算子は、int や double などの組み込み型だけでなく、クラス・構造体・共用体などユーザー定義のデータ型に対しても使用できます。sizeofの基本構文sizeof (data type)「data type」の部分には、サイズを調べたいデータ型や変数名を指定します。例えば、char 型のオブジェクトに適用した場合は必ず 1 を返しま

  2. C++のアクセス修飾子とは?public・private・protectedの違いをわかりやすく解説

    データ隠蔽(Data Hiding)は、オブジェクト指向プログラミング(OOP)における重要な機能の一つです。これにより、プログラム内の関数がクラス型の内部表現に直接アクセスすることを防ぎ、クラスの内部構造を保護できます。 クラスメンバーへのアクセス制限は、クラス本体内で指定する「アクセス修飾子」と呼ばれるラベル、すなわち public、private、protected の3つのセクションによって制御されます。 デフォルトのアクセスレベル C++では、クラスのメンバーおよびクラス自体のデフォルトのアクセスレベルは private です。アクセス修飾子を明示しない場合、メンバーは自動的に非公開