C++ の矢印演算子とドット演算子
C++ でクラス メンバーにアクセスするには、ドット演算子と矢印演算子の両方を使用します。 しかし、これは両方が同じという意味ではありません。
これら 2つの演算子にはいくつかの違いがあります。この記事で説明します。 この記事では、class、union、および struct 型はすべてクラス型
として扱われます。
ドット演算子とアロー演算子の違いを理解するために、まずこれら 2つの演算子の基本を見てみましょう。
C++ のドット (.
) 演算子
クラス メンバー アクセス演算子とも呼ばれる C++ のドット (.
) 演算子は、特定のクラスのパブリック メンバーにアクセスするのに役立ちます。 ここで、パブリック メンバーは、クラスの変数とメソッドに他なりません。
構文:
name_of_object.name_of_member;
例を見て、ドット演算子がどのように機能するかを見てみましょう。
次の例では、クラス desserts
には、1つのプライベート データ メンバー cakes
と、2つのパブリック メンバー関数 init()
と display()
と、パブリック データ メンバー chocolates
があります。
これで、ドット演算子を使用して特定の変数と関数にアクセスし、変数に値を割り当てることができます。 main()
関数内では、次の場所でドット演算子を使用していることに注意してください。
- パブリック メンバー関数
init()
を介してプライベート データ メンバーcakes
に値100
を割り当てる。 - 値
200
をパブリック データ メンバーchocolates
に割り当てる。 - public メンバー関数
display()
にアクセスします。
コード例:
#include <iostream>
using namespace std;
class desserts {
private:
int cakes;
public:
int chocolates;
void init(int cakes) { this->cakes = cakes; }
void display() { cout << "Number of cakes: " << cakes << endl; }
};
int main() {
// object declaration
desserts q;
// assign the values
q.init(100);
q.chocolates = 200;
// print the values
q.display();
cout << "Number of chocolates: " << q.chocolates << endl;
return 0;
}
出力:
Number of cakes: 100
Number of chocolates: 200
これは、C++ でドット演算子を使用する方法です。 では、矢印演算子がどのように機能するかを見てみましょう。
C++ のアロー (->
) 演算子
構造体または共用体の要素にアクセスするには、C++ で矢印演算子 (->
) を使用します。 アロー演算子は、構造体または共用体を指すポインター変数を使用します。
構文:
(name_of_pointer)->(name_of_variable)
例を見て、矢印演算子がどのように機能するかを見てみましょう。 構造体と共用体の両方で機能することに注意してください。
この例では、構造体で矢印演算子を使用しています。 ここで、構造体 desserts
には flavor
と number
の 2つのメンバーがあります。
この構造体には items
というオブジェクトがあります。 次に、main
ブロック内で、矢印演算子を使用して値 2
を変数 number
に割り当てます。
さらに、矢印演算子を使用して、変数 number
値にアクセスして出力します。 これは基本的に、矢印演算子が構造体でどのように機能するかです。
コード例:
#include <iostream>
using namespace std;
struct desserts {
char flavor[50];
int number;
};
// Create the object of the structure
struct desserts* item = NULL;
int main() {
item = (struct desserts*)malloc(sizeof(struct desserts));
// use arrow operator to assign value
item->number = 2;
cout << "The number of items: " << item->number;
return 0;
}
出力:
The number of items: 2
アロー演算子が共用体で使用されている別の例を見てみましょう。 ここで、共用体 desserts
には flavor
と number
の 2つのメンバーがあります。
このユニオンには items
というオブジェクトがあります。 次に、main
ブロック内で、矢印演算子を使用して変数 number
に値を代入します。
さらに、矢印演算子を使用して、変数 number
値にアクセスして出力します。 共用体の矢印演算子は、構造体の場合と同じように機能することに注意してください。
コード例:
#include <iostream>
using namespace std;
// union
union desserts {
char flavor[50];
int number;
};
union desserts* item = NULL;
int main() {
item = (union desserts*)malloc(sizeof(union desserts));
item->number = 5;
cout << "The number of items:" << item->number;
}
出力:
The number of items: 5
C++ の矢印演算子とドット演算子
C++ のドット演算子と矢印演算子の基本について説明したので、次はさらに深く掘り下げて、それらの違いを確認します。 知っておく必要があるドット演算子とアロー演算子のすべての違いのリストを次に示します。
-
ドット (
.
) 演算子はクラスの要素に直接アクセスしますが、アロー (->
) 演算子はポインターを使用してアクセスします。 要素への直接アクセスは次のようになります。object_name.element
一方、ポインターを使用して要素にアクセスするには、次のようにします。
pointer->element
つまり、オブジェクトにはドット (
.
) 演算子が使用され、オブジェクトを指すポインターには矢印演算子が使用されます。 これをよりよく理解するために、例を挙げてみましょう。オブジェクト
Demo
があり、そのメソッドの 1つtest()
を呼び出したいとします。 これを行うには、次のようにドット (.
) 演算子を使用します。Demo.test()
代わりに矢印演算子を使用すると、同じ意味にはなりません。 ここで、以下のコードはメソッド
test()
をオブジェクトDemo
ではなく、ポインタDemo
が指すオブジェクトに対して呼び出します。これは、矢印演算子が最初にポインターを逆参照するため、ポインターが指しているオブジェクトに移動できるためです。
Demo->test
-
矢印 (
->
) 演算子とは異なり、ドット (.
) 演算子をポインターに適用することはできません。(*p).element
はp->element
と同等であることに注意してください。(*p).element
内のこの括弧が使用されるのは、ドット (.
) 演算子の優先順位が*
よりも高いためです。 したがって、*
を最初に評価するには、括弧を使用します。ただし、これを単純化する最善の方法は、この部分全体を置き換えることです -
(*p)
をp->
のようなポインターに置き換えて、優先順位について混乱しないようにします。 -
C++ では矢印 (
->
) 演算子をオーバーロードできますが、ドット (.
) 演算子をオーバーロードすることはできません。 C++ での演算子のオーバーロードについて詳しくは、この ドキュメントを参照してください。
これは、ドット演算子とアロー演算子の違いに関するものでした。
まとめ
この記事では、ドット演算子と矢印演算子の基本について説明し、それらがどのように異なるかを確認しました。 矢印演算子が括弧とドット演算子の拡張であり、これら 2つの動作にどのように影響するかを見てきました。