Vector Class の Copy Constructor

Vector Class のコピーとコピーコンストラクタです。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 前回作成した Vector Class をベースにして、コピーコンストラクタを追加します。
    コピーコンストラクタは Object Class をコピーしたときに呼び出されるコンストラクタです。
    コピーコンストラクタの説明は Copy Constructor を参照して下さい。
  2. Vector をテストする Main Program(VectorTest.cpp)です。
    "Vector.h" をインクルードします。
    Vector<int> v1; でサイズを指定しないで Vector Class を定義します。
    v1.push_back(i) で、0~9の順に10件のデータを登録しています。
    v1 を v2 にコピーします。このときコピーコンストラクタが呼び出されます。
    次の二行は、どちらを書いても同じです。
    Vector<int> v2(v1);
    Vector<int> v2 = v1;
    コピーされた v2 を印字します。
    v2 のキャパシティーとサイズを確認して下さい。
    最後に v1 に登録されたデータを disp() 関数で印字します。
    /*★ Main Program  Step3    前田  稔 ★*/
    #include <iostream>
    #include "Vector.h"
    using namespace std;
    
    void disp( Vector<int>* p )
    {   for( int i=0; i<p->size(); i++)
            cout << p->at(i) << "  ";
        cout << endl;
    }
    
    void main()
    {   int i;
        Vector<int> v1;
    
        // 0~9を格納
        for(i= 0; i<10; i++)    v1.push_back(i);
    
        // v1 を v2 にコピー
        //Vector<int> v2(v1);
        Vector<int> v2 = v1;
        cout << "v2  ";
        disp( &v2 );
        // v2のキャパシティーとサイズ
        cout << "v2のキャパシティー=" << v2.capacity() << "  v2のサイズ=" << v2.size() << endl;
    
        cout << "v1  ";
        disp( &v1 );
    }
    
  3. template を使って Vector Class を定義した Vector.h ファイルです。
    前回作成した Vector Class をベースにして、拡張して行きます。
    Class をコピーすると、通常のコンストラクタは呼び出されないで、コピーコンストラクタが呼び出されます。
    今回追加するのはコピーコンストラクタだけです。
    /*★ Vector Class Step3    前田  稔 ★*/
    //※ 省略されている部分は前回作成した Vector Class を参照して下さい
    
        // コピーコンストラクタ
        Vector( const Vector& src )
        {   cout << "copy const\n";
            array_size   = src.array_size;
            current_size = src.current_size;
            array        = new T[array_size+1];
            for(int i= 0; i<current_size; i++)  array[i] = src.array[i];
        }
    

【演習】

Object Class をコピーすると、構造体と同様に v1 の内容がそのまま v2 にコピーされます。
コピーコンストラクタをコメントアウトして、プログラムを実行してみて下さい。
問題なく実行することが出来た?。 (^_^;)
それではコピーコンストラクタは必要無いのでしょうか。

コピーコンストラクタが必要なケースを思い出してみて下さい。
コピーコンストラクタの説明は Copy Constructor を参照して下さい。
Object Class をコピーすると、コンストラクタは呼び出さないで、デストラクタだけが呼び出されました。
コピーコンストラクタが無ければ実行結果がおかしくなる具体的な例をプログラムで示して下さい。
ちょっと難しいでしょうか。 (^_^;)

超初心者のプログラム入門(C/C++)