コピー・コンストラクターが必要な場合、代入演算子も自前で用意する必要が ある可能性が高い。
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 }
|