コピーコンストラクタ

copy-constractor.png

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

自分のクラスを引数とするコンストラクタのことである

public Miffy(Miffy _src){//これはコピーコンストラクタ
//中にはコピーしたいメンバをコピーするようなコードを書く
}

コピーコンストラクタよりかはコピーファクトリーが良いらしい。[4]
コンストラクタとコピーコンストラクタの関係は典型的なオーバーロードの例である。
ただし、
関数の中で、一部は入力に依存するけど、あとの一部は全く同じ!という場合コードが重複になる。
そういった場合は共通部分の関数をprivateで書いておく。
たとえば、コンストラクタとコピーコンストラクタの場合はprivateinitという関数を書く、という手法は頻繁に使用される。[3]))
operator=と同じ

正しいコピーコンストラクタの書き方

  • 戻り値はconstをつけない。
  • 戻り値は値渡しにする。
  • 引数はconst参照渡し
 CVertex& CVertex::operator=(const CVertex &_in) {
        x=_in.x;y=_in.y;z=_in.z;w=_in.w;
       return *this;
    }

自分自身を返す。

駄目な例

CMiffy& operator=(const CMiffy& _in){
 return CMiffy(_in.x,_in.y);
};

メンバーが0に初期化されてしまったりする

エラー例

no match for 'operator=' in なになに=Class::operator*(float)(parameter) candidates are Class Class::operator(Class&)

関数の引数にconstをつけてないとこのエラーがある。

コピーコンストラクタを書かないとどうなるか?

関数の引数としてオブジェクトを渡したときに、メンバ変数の値が変わってしまう。
なので、めんどくさいけど必ず作らないといけないもの。


assignment constructor copy

サポートサイト Wikidot.com assignmentconstructorcopy