C++ の矢印演算子とドット演算子

Shikha Chaudhary 2023年10月12日
  1. C++ のドット (.) 演算子
  2. C++ のアロー (->) 演算子
  3. C++ の矢印演算子とドット演算子
  4. まとめ
C++ の矢印演算子とドット演算子

C++ でクラス メンバーにアクセスするには、ドット演算子と矢印演算子の両方を使用します。 しかし、これは両方が同じという意味ではありません。

これら 2つの演算子にはいくつかの違いがあります。この記事で説明します。 この記事では、class、union、および struct 型はすべてクラス型として扱われます。

ドット演算子とアロー演算子の違いを理解するために、まずこれら 2つの演算子の基本を見てみましょう。

C++ のドット (.) 演算子

クラス メンバー アクセス演算子とも呼ばれる C++ のドット (.) 演算子は、特定のクラスのパブリック メンバーにアクセスするのに役立ちます。 ここで、パブリック メンバーは、クラスの変数とメソッドに他なりません。

構文:

name_of_object.name_of_member;

例を見て、ドット演算子がどのように機能するかを見てみましょう。

次の例では、クラス desserts には、1つのプライベート データ メンバー cakes と、2つのパブリック メンバー関数 init()display() と、パブリック データ メンバー chocolates があります。

これで、ドット演算子を使用して特定の変数と関数にアクセスし、変数に値を割り当てることができます。 main() 関数内では、次の場所でドット演算子を使用していることに注意してください。

  1. パブリック メンバー関数 init() を介してプライベート データ メンバー cakes に値 100 を割り当てる。
  2. 200 をパブリック データ メンバー chocolates に割り当てる。
  3. 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 には flavornumber の 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 には flavornumber の 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++ のドット演算子と矢印演算子の基本について説明したので、次はさらに深く掘り下げて、それらの違いを確認します。 知っておく必要があるドット演算子とアロー演算子のすべての違いのリストを次に示します。

  1. ドット (.) 演算子はクラスの要素に直接アクセスしますが、アロー (->) 演算子はポインターを使用してアクセスします。 要素への直接アクセスは次のようになります。

    object_name.element
    

    一方、ポインターを使用して要素にアクセスするには、次のようにします。

    pointer->element
    

    つまり、オブジェクトにはドット (.) 演算子が使用され、オブジェクトを指すポインターには矢印演算子が使用されます。 これをよりよく理解するために、例を挙げてみましょう。

    オブジェクト Demo があり、そのメソッドの 1つ test() を呼び出したいとします。 これを行うには、次のようにドット (.) 演算子を使用します。

    Demo.test()
    

    代わりに矢印演算子を使用すると、同じ意味にはなりません。 ここで、以下のコードはメソッド test() をオブジェクト Demo ではなく、ポインタ Demo が指すオブジェクトに対して呼び出します。

    これは、矢印演算子が最初にポインターを逆参照するため、ポインターが指しているオブジェクトに移動できるためです。

    Demo->test
    
  2. 矢印 (->) 演算子とは異なり、ドット (.) 演算子をポインターに適用することはできません。 (*p).elementp->element と同等であることに注意してください。

    (*p).element 内のこの括弧が使用されるのは、ドット (.) 演算子の優先順位が * よりも高いためです。 したがって、* を最初に評価するには、括弧を使用します。

    ただし、これを単純化する最善の方法は、この部分全体を置き換えることです - (*p)p-> のようなポインターに置き換えて、優先順位について混乱しないようにします。

  3. C++ では矢印 (->) 演算子をオーバーロードできますが、ドット (.) 演算子をオーバーロードすることはできません。 C++ での演算子のオーバーロードについて詳しくは、この ドキュメントを参照してください。

これは、ドット演算子とアロー演算子の違いに関するものでした。

まとめ

この記事では、ドット演算子と矢印演算子の基本について説明し、それらがどのように異なるかを確認しました。 矢印演算子が括弧とドット演算子の拡張であり、これら 2つの動作にどのように影響するかを見てきました。

関連記事 - C++ Operator