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;
};
}
该类就不做过多介绍了,其他类可以继承该类,以明确知道该类可以做拷贝,算是代码规范吧
|