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

C++のアロー演算子(->)とは?ドット演算子との違いを実例で解説

C++では、クラスや構造体のメンバーにアクセスする際に、ドット演算子(.)アロー演算子(->)の2種類を使います。どちらも同じ目的で使用されますが、適用される場面が異なります。C++において、class、struct、unionとして宣言された型はすべて「クラスタイプ」に分類されるため、以下の説明はこれら3つすべてに当てはまります。

ドット演算子(.)とアロー演算子(->)の使い分け

a.b の場合

a.b は、b がオブジェクトa(またはオブジェクトへの参照)のメンバーである場合にのみ使用できます。つまり、a.b における a は、常にクラスの実体(オブジェクト本体)か、オブジェクトへの参照でなければなりません。

a->b の場合

a->b は、本質的に (*a).b の省略記法です。つまり、a がオブジェクトへのポインタである場合、a->b は「aが指し示すオブジェクトのメンバーb」にアクセスすることを意味します。

演算子のオーバーロードについて

重要なポイントとして、ドット演算子はオーバーロードできませんが、アロー演算子(->)はオーバーロード可能です。そのため、独自の operator->() 関数を定義し、この演算子が使われたときの動作をカスタマイズできます。

a が operator-> をオーバーロードしたクラスのオブジェクトである場合(代表的な例としてはスマートポインタやイテレータ)、その動作はクラス設計者が実装した内容に依存します。

なお、参照は意味的にはオブジェクトの別名(エイリアス)であるため、「ポインタへの参照」の場合についても言及すべきですが、ポインタへの参照(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」が出力されることが確認できます。状況に応じて正しく使い分けることが、C++プログラミングの基本となります。

  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 です。アクセス修飾子を明示しない場合、メンバーは自動的に非公開