【muduo/base】对象拷贝控制

nocopyable 类

nocopyable功能:让该类的派生类对象无法拷贝

class noncopyable
{
 public:
  noncopyable(const noncopyable&) = delete;
  void operator=(const noncopyable&) = delete;

 protected:
  noncopyable() = default;
  ~noncopyable() = default;
};

分析

如何禁止对象的拷贝

在c++中拷贝发生的时机为:使用赋值号"="赋值和使用a对象初始化b对象时(最常见的是函数按值传参):

假设有class A

A a;
A b(a); //调用拷贝构造函数
b = a; //使用赋值运算符

因此,我们可以禁止赋值运算符和拷贝运算符被用户(包括编译器)调用,来实现禁止对象拷贝的功能。

方法1: 将拷贝构造函数和赋值运算符声明为private
方法2: 将拷贝构造函数和赋值运算符声明为delete
建议方法2。方法1需要我们人为定义函数体,拷贝构造函数和赋值运算符函数还是会存在,只是编译器无法调用,来达到不能拷贝对象的目的。而方法2,直接禁止了拷贝构造函数的生成,以及赋值相关的汇编代码的生成。

为何将构造函数和析构函数声明为protected

将构造函数声明为protected可以禁止nocopyable类的创建,而且可以让其他类继承。如果声明为private,将无法被继承,因为派生类创建对象,需要调用基类构造函数(一些情况下我们定义的子类没有显示调用基类构造函数,编译器会根据默认规则帮我们调用基类的构造构造函数[该部分内容可以在effectivec++中查阅到])以完成基类对象部分的初始化

copyable类

class copyable
{
 protected:
  copyable() = default;
  ~copyable() = default;
};

} 

该类就不做过多介绍了,其他类可以继承该类,以明确知道该类可以做拷贝,算是代码规范吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值