零弐壱蜂

[C++] ドット(.)と矢印(->)の演算子の違い

概要

C++で実装をしていると、.(ドット)演算子と ->(アローまたは矢印)演算子に出会うことがある。どちらもオブジェクトのメンバー(JavaScriptでいうプロパティやメソッドのようなもの)へアクセスするために使うが、いつ、どちらを使えばよいのか迷うことがある。

解説

.(ドット演算子)演算子は、オブジェクトが直接指定された場合に使用される。具体的には、 Person.age は、 Person オブジェクトの age メンバーにアクセスするために使用される。

一方、 ->(矢印演算子) は、オブジェクトがポインタで指定された場合に使用される。具体的には、 Person->age は、 Person ポインタが指すオブジェクトの age メンバーにアクセスするために使用される。矢印演算子は、ポインタの値を解除してから、そのオブジェクトのメンバーにアクセスするための省略表記である。

ドット演算子(.

たとえば、以下のような構造体を定義したとする。

struct Person {
  char name[20];
  int age;
};

この場合、nameage にアクセスするためには、.(ドット演算子)を使う。

struct Person p;
strcpy(p.name, "John");
p.age = 30;

アロー演算子(->

一方、ポインタを使って構造体にアクセスする場合には、ポインタを->(矢印演算子)で参照する。

struct Person *ptr;
ptr = &p;
strcpy(ptr->name, "John");
ptr->age = 30;
// (*ptr).age = 30; // こちらも同じ意味

このように、C 言語でもドット演算子は構造体のメンバーにアクセスするために使用されるが、ポインタを使う場合には矢印演算子が使用される。

結論

  • .(ドット演算子): オブジェクトそのものからメンバーにアクセスするときに使う。
  • ->(アロー演算子): オブジェクトを指し示すポインタ(オブジェクトのメモリアドレスを保持するもの)からメンバーにアクセスするときに使う。

JavaScriptでは、オブジェクトのプロパティにアクセスする際は常にドット演算子(例: object.property)を使うことが多いが、C++ではオブジェクトの扱い方によって演算子を使い分ける必要がある。この違いがC++のメモリ管理の柔軟性にも繋がっている。