コピー・コンストラクターが必要な場合、代入演算子も自前で用意する必要が ある可能性が高い。
T& operator=(const T&) という宣言になる。 ここで const は絶対必要である。
substitution.C |
1 #include <iostream.h> 2 3 class Vector { 4 private: 5 int dim; 6 double *body; 7 public: 8 Vector(int n) { 9 dim = n; body = new double [dim]; 10 } 11 Vector() { dim = 0; body = 0; } 12 ~Vector() { delete [] body; } 13 int dimension() const { return dim; } 14 double& element(int i) const { return body[i]; } 15 // コピーコンストラクター 16 Vector(const Vector&); 17 // 代入演算子 18 Vector& operator=(const Vector &); 19 }; 20 21 // コピーコンストラクター 22 Vector::Vector(const Vector& x) 23 { 24 dim = x.dim; 25 body = new double [dim]; 26 for (int i = 0; i < dim; i++) 27 body[i] = x.element(i); 28 } 29 30 // 代入演算子 31 Vector& Vector::operator=(const Vector &x) 32 { 33 // 自己代入のチェック 34 if (&x != this) { 35 delete [] body; 36 dim = x.dimension(); 37 body = new double [dim]; 38 for (int i = 0; i < dim; i++) 39 body[i] = x.element(i); 40 } 41 // 次は代入演算子の定跡 42 return *this; 43 } 44 45 int main() 46 { 47 int i; 48 const int n = 3; 49 Vector a(n); 50 for (i = 0; i < n; i++) a.element(i) = i; 51 Vector b, c(n); 52 b = a; 53 c = a; 54 for (i = 0; i < n; i++) cout << a.element(i) << endl; 55 for (i = 0; i < n; i++) cout << b.element(i) << endl; 56 for (i = 0; i < n; i++) cout << c.element(i) << endl; 57 } |