HOWTO · C++

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

この記事では、C++ のドット演算子とアロー演算子の違いについて説明します。 また、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 には 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++ のドット演算子と矢印演算子の基本について説明したので、次はさらに深く掘り下げて、それらの違いを確認します。 知っておく必要があるドット演算子とアロー演算子のすべての違いのリストを次に示します。

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

    object_name.element
    

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

    pointer->element
    

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

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

    Demo.test()
    

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

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

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

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

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

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

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

まとめ

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