next up previous contents
Next: D.11 valarray Up: D.10 クラス定義についての注意 Previous: D.10.2 コピー・コンストラクター

D.10.3 代入演算子

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

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 }


next up previous contents
Next: D.11 valarray Up: D.10 クラス定義についての注意 Previous: D.10.2 コピー・コンストラクター
Masashi Katsurada
平成18年4月28日