C++ コピーコンストラクタとは?

コンストラクタは、クラスのインスタンス作成時に自動的に呼ばれ、
クラスのメンバ変数の初期化などに用いられました。

その際、コンストラクタの引数には、
定数、変数などの値を使用する事ができました。

コンストラクタには、コピーコンストラクタと言うコンストラクタもあり、
これは、同じクラスオブジェクトを使って初期値する機能です。

普通の変数の初期化で例えると次のような考え方になります。

int a = 10;      // int型変数aを宣言し、10で初期化する。

int b = a;       // int型変数bを宣言し、同じint型変数aで初期化する。

通常のコピーコンストラクタは、
引数に同じクラスオブジェクトの参照を用います。

クラスhitoのコピーコンストラクタ例

hito::hito(const hito &object) {
      初期化コード
}

コピーコンストラクタ使用例

ファイル名:hito.h

class hito {
public:
      int age;
      int sinchou;
      int taiju;

      // コンストラクタ
      hito(int age = 0, int sinchou = 0, int taiju = 0);

      // コピーコンストラクタ
      hito(const hito &object);

};

ファイル名:hito.cpp

#include "hito.h"

// コンストラクタ
hito(int age, int sinchou, int taiju) {
      this->age = age;
      this->sinchou = sinchou;
      this->taiju = taiju;
}

// コピーコンストラクタ
hito(const hito &object) {
      this->age = object.age;
      this->sinchou = object.sinchou;
      this->taiju = object.taiju;
}

ファイル名:main.cpp

#include "hito.h"

void main(void) {
      hito satou(20, 170, 60);      // コンストラクタ呼び出し
      hito suzuki(satou);           // コピーコンストラクタ呼び出し
                                    // hito suzuki = satou;と
                                    // 書いてもOK
}

この例では、クラスhitoのコピーコンストラクタの動作確認をしています。

まず、クラスhitoのインスタンスsatouを作成しています。

この時は、通常通り、コンストラクタが呼び出され、
satou.age、satou.sinchou、satou.taijuに、それぞれの値で初期化されます。

次に、クラスhitoのインスタンスsuzukiを作成しています。

この時は、コピーコンストラクタが呼び出され、
suzukiのメンバ変数は、satouのメンバ変数の値で初期化される事になります。