『Effective C艹』読書ノート(8)

1159 ワード

条項12:対象を複製する時、その各成分を忘れないでください
 
簡単なクラスのコピー関数については、このように書くことができます.
class base{
public:
    int data;
    base& operator=(const base& a){
        this->data = a.data;
        return *this;
    }
};

コピーコンストラクション関数の場合は、付与コピーの場合と同様です.この場合、このクラスを変更してdouble bを追加しますが、付与関数を変更しないと、付与を行うと新しく追加した変数が漏れてしまいます!したがって、クラスを変更した後、コンストラクション関数および付与関数の更新を忘れないでください.
    
継承関係がある場合、コピー構造関数をこのように書くと
class dev:public base{
public:
    int devdata;
    dev(const dev& a):base(a),devdata(a.devdata){}
};

ベースクラスの初期化が漏れてしまうので、ベースクラスの部分を初期化することに注意しましょう
class dev:public base{
public:
    int devdata;
    dev(const dev& a):base(a),devdata(a.devdata){}
};

付与演算子については、
class dev:public base{
public:
    int devdata;
    dev(const dev& a):base(a),devdata(a.devdata){}
    dev& operator=(const dev& a){
        base::operator=(a);
        devdata = a.devdata;
        return *this;
    }
};