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

C++のドット演算子(.)とは?矢印演算子との違いと使い分けを解説

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

C++において、class・struct・unionとして宣言された型はすべて「クラス型」とみなされます。以下では、これらに対する両演算子の使い方を説明します。

ドット演算子(a.b)

a.b は、b がオブジェクト a(またはオブジェクトへの参照[1])のメンバーである場合にのみ使用できます。つまり、a.b の形式では、a は必ずクラス型の実際のオブジェクト(またはその参照)である必要があります。

矢印演算子(a->b)

a->b は、本質的には (*a).b の省略記法です。a がオブジェクトへのポインターである場合、a->b はそのポインターが指す先のオブジェクトのメンバー 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

オブジェクト a 自体にはドット演算子で、a を指すポインター x には矢印演算子でアクセスしており、どちらも同じメンバー値 5 が取得できることが確認できます。

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