Arrayクラスを作る (代入演算子編)

コピーコンストラクタと併せて、代入演算子も定義してしまいましょう。

動作はコピーコンストラクタと殆ど同じですが、代入演算子は初期化済みのオブジェクトからも呼び出される可能性もあるので、古いデータを破棄するための Destroy 呼び出しを挟む必要があります。

Code 1
//代入
template<typename T> Array<T>& Array<T>::operator = (operator& Array<T> a){
if (a.m_nSize){
int nSize =a.m_nSize;
T*  lpa    =new T [nSize];
int i;
for (i=0; i<nSize; ++i) lpa[i] =a.m_lpa[i];
Destroy();
m_nSize =nSize;
m_lpa   =lpa;
}
else {
Destroy();
m_nSize =0;
m_lpa   =NULL;
};
return *this;
}

注意点 1: 古い配列領域を解放するタイミング

上記のコードは、新しい配列領域への要素値のコピーを行った後に、Destroy を呼び出して古い配列領域 で解放しています。
これを逆の順番 (古い配列領域を開放→新しい配列データを作成) で行うと、自己代入 (下例参照) が上手くいかなくなります。

code 2
Array<char> ac(5);
ac[0] ='A';
ac[1] ='r';
ac[2] ='r';
ac[3] ='a';
ac[4] ='y';
ac =ac; //自己代入