1. ホーム
  2. c++

[解決済み] コピーコンストラクタを使用しなければならないのはどのような場合か?

2023-03-04 21:54:20

質問

C++コンパイラがクラスのコピーコンストラクタを作成することは知っています。どのような場合に、ユーザ定義のコピーコンストラクタを書かなければならないのでしょうか。いくつかの例を挙げることができますか?

どのように解決するのですか?

コンパイラが生成するコピーコンストラクタはメンバ単位でコピーを行います。それが十分でない場合があります。例えば

class Class {
public:
    Class( const char* str );
    ~Class();
private:
    char* stored;
};

Class::Class( const char* str )
{
    stored = new char[srtlen( str ) + 1 ];
    strcpy( stored, str );
}

Class::~Class()
{
    delete[] stored;
}

をメンバー単位でコピーする場合 stored メンバはバッファを複製しないので (ポインタだけがコピーされます)、バッファを共有する最初に破壊されるコピーでは delete[] を正常に呼び出すことができ、2番目のコピーは未定義の動作に陥ります。深いコピーのコピーコンストラクタ(と同様に代入演算子)が必要です。

Class::Class( const Class& another )
{
    stored = new char[strlen(another.stored) + 1];
    strcpy( stored, another.stored );
}

void Class::operator = ( const Class& another )
{
    char* temp = new char[strlen(another.stored) + 1];
    strcpy( temp, another.stored);
    delete[] stored;
    stored = temp;
}