Help us understand the problem. What is going on with this article?

C++ アロー演算子(->)とドット演算子(.)の違い

はじめに

当記事では、C++においてのアロー演算子とドット演算子の違いを、前提として理解しておくべきことも含め解説します。

アロー演算子とドット演算子

アロー演算子とは、

aaa->bbb();

ドット演算子とは、

aaa.bbb();

です。
C#では、全てドット演算子で統一されていますが、newでメモリを確保していますね。

classB.cs
void myFunc()
{
    ClassA classA = new ClassA();//メモリ確保
    classA.someValue = 7;
}

これは内部的にはポインタのような扱いで、C++でのポインタの扱いと似ていますが、
C++では変数からの呼び出しと、ポインタからの呼び出しで使い分ける必要があります。

ちなみに、以下のようなコードだと、確保できていないメモリ領域のメンバ変数(オブジェクト)を参照しようとしているので
コンパイルエラーとなるわけです。

classB.cs
void myFunc()
{
    ClassA classA;//newしていないからメモリ確保できていない
    classA.someValue = 7;//NullReferenceException!!
}

メモリに於けるヒープ領域とスタック領域

基本的には、プログラムをコンパイルした時点で該当セクションのサイズやアドレスが決定されます。
それらのサイズやアドレスはプログラムの動作中に変わることはありません。
それに対して、ヒープ領域やスタック領域はプログラムを実行する上で必要な一時的なメモリを保管する場所です。

ヒープ領域

プログラム(アプリケーション)やオペレーティングシステムにより動的に確保/解放される。

スタック領域

コンパイラーや、オペレーティングシステムにより確保(割当)/解放される。

メリット・デメリット

スタック領域はコンパイラやオペレーティングシステムが自動的に割り当ててくれるので、プログラマ側の負担が少ないです。
ただし予め使用できるサイズが決定されているので、スタックオーバーフローを引き起こしえます。
C#に於けるスタックオーバーフロー(.NET Framework 4.8)
これに対してヒープ領域は、その場で一時的に必要な領域を動的に確保/解放できるので、予めスタック領域に余分にサイズを確保する必要がなく、結果的に使われない無駄な領域を削減することができます。

アロー演算子

本題に戻ります。
簡単に言うと、アロー演算子はポインタ変数に対して使用します。
例として以下のソースコードを使用します。

class MyClass {
public:
    int dog = 3;
    float cat = 6.5f;
};

int main()
{
    MyClass* myClass = new MyClass();
    myClass->cat = 3;

    delete myClass;
}

ここでは、先ず

MyClass* myClass;

でポインタ変数を定義します。
この状態では、まだメモリ領域が確保されておらず、このオブジェクトを参照することは出来ません。

次に、

myClass = new MyClass();

で動的にメモリ領域を確保します。(オブジェクトの生成)
この状態で、晴れてポインタ変数myClassを参照することができます。

このとき、ポインタ変数myClassスタック領域に位置し、
オブジェクトはヒープ領域に生成されます。
そして、ポインタ変数であるmyClassを参照する際に、アロー演算子->を使用します。

myClass->cat = 3;

最後に、一時的に確保したヒープ領域のオブジェクトを解放してあげます。

delete myClass;

ドット演算子

変数からの呼び出しには、ドット演算子を用います。
例として、以下のソースコードを使用します。

class MyClass {
public:
    int dog = 3;
    float cat = 6.5f;
};

int main()
{
    MyClass mc;
    mc.cat = 33;
}

このとき、変数であるmcとそのオブジェクトは全てスタック領域に存在します。
したがって、ドット演算子を用います。

おわり

本記事内で、誤字脱字や間違った情報がございましたら、お手数ですがコメント欄にてご指摘頂ければと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした