阻止拷贝的三种方法--Cpp

本文探讨了在C++中如何阻止对象被拷贝,包括将拷贝构造函数和赋值操作符声明为私有并仅声明不实现,创建一个专门的Uncopyable基类,以及使用C++11的删除特性。

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

当一个对象是独一无二的时候,为这个对象做一个副本有点没道理,所以我们应阻止对它进行的拷贝,但是,阻止这一动作并不是很直观,通常来说,你不希望class的某一功能,只要不声明对应的函数就行了,但这个策略对拷贝构造函数和赋值操作符思是无效的,因为如果你不声明它们,编译器会替你声明一个默认的,那么该如何解决这个问题呢,通常来说,可以采取如下三种方法。

  1. 将拷贝构造函数和赋值操作符声明为私有成员函数,并且只声明而不实现,这样似乎变得更安全一些,然而如果类的成员函数和友元函数调用它时,将会发挥僧错误,不过这种错误很容易检查出来。
class A{
public:
  A(){}
  ~A(){}
private:
   A(const A&);
   A& operator=(const A&);
};
  1. 为这两个操作单独写出一个类,如下:
class Uncopyable{
protected:
  Uncopyable(){}
  ~Uncopyable(){}
private:
   Uncopyable(const Uncopyable&);
   Uncopyable& operator=(const Uncopyable&);
};
//为阻止拷贝与赋值操作符,继承Uncopyable类;
class A: private Uncopyable(){
...
};

这样,同样能达成我们的目的。

  1. 我们还可以定义删除的函数,它是这样一种函数,虽然我们声明了它们,但是我们不能以任何一种方式使用它,在函数的参数列表后面加上=delete来指出我们希望它定义为删除的。
class Uncopyable{
public:
   Uncopyable(const Uncopyable&) = delete;
   Uncopyable& operator=(const Uncopyable&) = delete;
};

需要注意的是我们一般不定义析构函数为删除的,那样我们将不能销毁此类型的对象了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值