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

本文介绍如何通过将拷贝构造函数和赋值操作符声明为私有来阻止类被拷贝。同时提供了一种改进方法,通过定义一个基类来避免连接期错误,确保编译期间就能发现错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


如果想让你的类不能使用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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值