next up previous
Next: この文書について... Up: C++のめんどくさい利用法 Previous: イテレータ

コピーコンストラクタ

構造体やクラスのインスタンスを直接関数の引数に渡したり, 関数の返値にしたりする場合を考えてみよう.

Point home(Point x)
{
    x.move_to(0,0);
    return x;
}
...
    Point p(10,20,1);
    Point q = home(p);
さっき定義したPointには引数のないコンストラクタが 定義されていないので,このままだとPoint qの部分がエラーになるが, それはここでは置いておく.

この例で,home(p)を呼び出す場合,次のような処理が行われている.

  1. pの内容をスタックにコピーする.
  2. 関数homeの先頭にジャンプ.
  3. homeの内容を実行する.
  4. xの内容をスタックにコピーする.
  5. スタックの内容をqにコピーする.
ここでは,インスタンスの内容をコピーするという操作が頻繁に行われる. この「インスタンスの内容をコピーする」という操作は,新しいインスタンスを 作っているのと同じだから,この時にもコンストラクタが呼び出される. この時呼び出されるコンストラクタを,コピーコンストラクタという. コピーコンストラクタは,次のような形を している.
class Point : public GraphicObject {
    ....
    public:
    Point(Point& x); // コピーコンストラクタ
};

コピーコンストラクタは,自分と同じ型への参照を引数として持つ. クラス定義の中でコピーコンストラクタを定義しない場合,「各メンバ 変数の値をそれぞれコピーする」という動作をするコピーコンストラクタが 暗黙に定義される.それではすまない場合は,コピーコンストラクタを 自分で定義しなくてはならない.



Akinori ITO
Thu Aug 7 15:05:13 JST 1997