禁止使用类的copy构造函数和赋值操作符


如果想让你的类不能使用copy构造函数和赋值操作符,只要将该类的copy构造函数和赋值操作符函数定义为private即可,并且只是声明,不用实现.
  1. class TestClass
  2. {
  3. public:
  4.     TestClass()
  5.         :X(0)
  6.     {
  7.     }
  8.     TestClass(int x)
  9.         :X(x)
  10.     {
  11.     }

  12.     ~TestClass(){}

  13.     void Show()
  14.     {
  15.         cout << "X = " << X << endl;
  16.     }

  17. private:
  18.     TestClass(const TestClass&);
  19.     TestClass& operator=(const TestClass&);

  20. private:
  21.     int X;
  22. };


  23. int main()
  24. {

  25.     TestClass t(3);
  26.     t.Show();

  27.     TestClass t1(t);
  28.     TestClass t2;
  29.     t2 = t;

  30.     return 0;
  31. }

编译错误为:

'TestClass::TestClass' : cannot access private member declared in class 'TestClass'

'TestClass::operator =' : cannot access private member declared in class 'TestClass'

这种方法的一点小缺陷是,如果该类的成员函数或其friend函数调用copy构造函数或赋值操作符函数,会将错误推后到连接期。有一种方法可以将连接期错误移至编译期。

先定义一个基类

  1. class UnCopyable
  2. {
  3. public:
  4.     UnCopyable();
  5.     ~UnCopyable();

  6. private:
  7.     UnCopyable(const UnCopyable&);
  8.     UnCopyable& operator=(const UnCopyable&);
  9. };

然后让你的类继承UnCopyable类

  1. class TestClass : public UnCopyable
  2. {
  3. public:
  4.     TestClass()
  5.         :X(0)
  6.         ,Y(0)
  7.     {
  8.     }

  9.     TestClass(int x, int y)
  10.         :X(x)
  11.         ,Y(y)
  12.     {
  13.     }

  14.     ~TestClass(){}

  15.     void Show()
  16.     {
  17.         cout << "X = " << X << ", Y = " << Y << endl;
  18.     }

  19. private:
  20.     int X;
  21.     int Y;

  22. };

其继承方式,不一定为 public,亦可为private


你可能感兴趣的:(禁止使用类的copy构造函数和赋值操作符)