コピーコンストラクター
読み:コピーコンストラクター
外語:copy constructor

 C++において、インスタンスがコピーされるときに呼び出されるコンストラクター
目次

概要
 あるクラスのインスタンスとしてobj1が定義されたとし、同じクラスでobj2を定義する際に、次のようにobj1を使って初期化するとする。
 CExample obj2 = obj1;
 この時、コピーコンストラクターが呼び出される。

特徴

定義
 名前は、通常のコンストラクターと同様にクラス名とする。
 通常のコンストラクターとの区別は、引数で行なわれる。
 引数は、そのクラス自身のインスタンスを参照渡しで受け取るようにし、更にconstが指定される。
 class CExample {
 public:
 CExample(const CExample &obj); // コピーコンストラクター
 };
 処理は、次のように書かれる。
 CExample::CExample(const CExample &obj)
 {
 ...
 }

目的
 コピーコンストラクターが存在する理由は、二度初期化されることを避けるためである。
 最初の例にあるように、
 CExample obj2 = obj1;
 とした場合、理論上は、obj2が宣言された時点で初期化され、更にobj1の値を使って初期化され、都合二回初期化されることになる。しかしそうであれば、最初のobj2の初期化は完全に無駄となる。このような無駄を避けるため、この場合はコピーコンストラクターが一回だけ呼び出される。
 なお、この式は「代入」ではない。次のように書けば代入になるが、この場合はコピーコンストラクターは呼び出されない。
 CExample obj2; // obj2のコンストラクターが呼ばれる
 obj2 = obj1; // ただの代入

デフォルトコピーコンストラクター
 通常のコンストラクターと同様、明示的にデフォルトコピーコンストラクターを用意しなかった場合にはコンパイラーが暗黙のうちにコピーコンストラクターを用意する。これをデフォルトコピーコンストラクターという。
 その動作は単純で、単にクラスのメンバーをコピーしているだけである。

再検索