C/C++ ポインタ入門 > 動的配列クラス > コピーコンストラクタ
Nobuhide Tsuda
Jan-2014
コピーコンストラクタ:
Vector::Vector(const Vector &x)
: m_size(x.m_size) // コピー元のサイズで初期化
, m_capacity(x.m_capacity) // コピー元のキャパシティで初期化
, m_data(new int[x.m_capacity]) // コピー元のキャパシティのサイズのメモリを確保
{
for (int i = 0; i < m_size; ++i) {
m_data[i] = x.m_data[i]; // コピー元のデータをコピー
}
}
解説:
- コピーコンストラクタは、型が無く、クラス名::クラス名(const クラス名 &) {...} で実装します。
- メンバイニシャライザで、メンバ変数の初期化を行います。値はコピー元オブジェクトを参照します。
- データ領域だけは new int[x.m_capacity] でアロケートしたアドレスで m_data を初期化します。
- m_data を x.m_data で初期化してはいけません。
- コンストラクタ本体内で、コピー元のデータをコピーします。
- ※ メンバイニシャライザで初期化される順序はコンストラクタで記述した順序ではなく、クラスで宣言した時の順番です。
m_data, m_capacity, m_size の順に宣言されているので、初期化もその順序になります。
したがって、m_data(new int[m_capacity]) と記述することは出来ません。
メンバイニシャライザで初期化する場合は、自分自身のメンバ変数を参照せず、必ず引数オブジェクトのメンバ変数を参照した方が安全です。
前:
| 次: