2010年03月11日

C++のコピーコンストラクタと代入演算子

コピーコンストラクタも代入演算子もオブジェクトの代入を行う場合に呼ばれる処理だけど、呼び出されるタイミングが異なります。

1.コピーコンストラクタ


コピーコンストラクタは、オブジェクトを生成する時に、生成するオブジェクトを別のオブジェクトで初期化する処理です。次のような構文で宣言します。

クラス名(const クラス名& obj);

コピーコンストラクタは、以下のような場合に呼ばれます。

CSample obj1 = obj2;

この例では、CSampleクラスのコピーコンストラクタが呼ばれて、obj1が初期化されます。コピーコンストラクタの実装例を以下に示します。赤字の部分がコピーコンストラクタです。メンバ変数valuesの値をコピーしています。

class CSample
{
public:
  CSample(const int v) {
    this->values[0] = v;
    this->values[1] = v;
    this->values[2] = v;
  }

  CSample() {
  }

  CSample(const CSample& obj) {
    const int* v = obj.values;

    this->values[0] = v[0];
    this->values[1] = v[1];
    this->values[2] = v[2];

    printf("コピーコンストラクタが呼ばれました\n");
  }


  int values[3];
};




2.代入演算子


代入演算子は生成されたオブジェクトに別のオブジェクトを代入する場合に呼ばれます。構文は次のようになります。

クラス名& operator=(const クラス名& obj);

代入演算子の使用例を以下に示します。

CSample obj1, obj2;
obj1 = obj2;

先ほど示したCSampleクラスに、代入演算子をオーバーロードする処理を追加した例を以下に示します。赤字の部分が代入演算子です。コピーコンストラクタと同様に、メンバ変数valuesの値をコピーしています。

class CSample
{
public:
  CSample(const int v) {
    this->values[0] = v;
    this->values[1] = v;
    this->values[2] = v;
  }

  CSample() {
  }

  CSample(const CSample& obj) {
    const int* v = obj.values;

    this->values[0] = v[0];
    this->values[1] = v[1];
    this->values[2] = v[2];

    printf("コピーコンストラクタが呼ばれました\n");
  }

  CSample& operator=(const CSample& obj) {
    const int* v = obj.values;

    this->values[0] = v[0];
    this->values[1] = v[1];
    this->values[2] = v[2];

    printf("代入演算子が呼ばれました\n");
  }


  int values[3];
};


3.CSampleクラスのテスト


コピーコンストラクタと代入演算子を実装したCSampleクラスを利用するプログラムを、以下に示します。コピーコンストラクタも代入演算子もきちんと機能していることが判ります。

int main()
{
  CSample obj1(5);
  CSample obj2 = obj1;

  printf("obj1のvaluesメンバ\n");
  obj1.printValues();
  printf("obj2のvaluesメンバ\n");
  obj2.printValues();

  CSample obj3(10);
  CSample obj4;
  obj4 = obj3;

  printf("obj3のvaluesメンバ\n");
  obj3.printValues();
  printf("obj4のvaluesメンバ\n");
  obj4.printValues();

  return 0;
}

実行すると、以下のように表示されます。

コピーコンストラクタが呼ばれました
obj1のvaluesメンバ
values[0]=5
values[1]=5
values[2]=5

obj2のvaluesメンバ
values[0]=5
values[1]=5
values[2]=5

代入演算子が呼ばれました
obj3のvaluesメンバ
values[0]=10
values[1]=10
values[2]=10

obj4のvaluesメンバ
values[0]=10
values[1]=10
values[2]=10

メンバ変数valuesがコピーされています。


    • 0 Comment |
    • 0 Trackback |
    • このエントリーをはてなブックマークに追加
    • Edit

この記事へのトラックバックURL

 

トラックバックはまだありません。

コメントはまだありません。

コメントする。

絵文字
 
星  顔