我是FFZero,一个10年开发经验的cpper。
C++武器库系列尝试带领大家认识开发中常用的基础类,补充项目工具库中的底层原理,
在C++中,noncopyable 类是一个常用的基类,用于禁止类的拷贝构造和赋值操作。这种模式主要用于确保某些对象不被复制,通常适用于需要保持唯一性或在内部管理资源的类,例如文件句柄、网络连接、线程等。今天我们一起来学习noncopyable类的应用。
noncopyable类定义
noncopyable类的定义:
//禁止拷贝基类
class noncopyable {
protected:
noncopyable() {}
~noncopyable() {}
private:
//禁止拷贝
noncopyable(const noncopyable &that) = delete;
noncopyable(noncopyable &&that) = delete;
noncopyable &operator=(const noncopyable &that) = delete;
noncopyable &operator=(noncopyable &&that) = delete;
};
noncopyable类实现思路
- 构造函数和析构函数保护.
- 构造函数和析构函数被声明为 protected,这意味着只有派生类可以直接实例化和销毁 noncopyable 的对象,不能在外部直接使用 new noncopyable()。
- 这样设计的目的是防止直接实例化 noncopyable 类,确保它只被用于作为基类。
- 禁止拷贝和移动
- noncopyable 通过将拷贝构造函数、拷贝赋值运算符、移动构造函数和移动赋值运算符都设置为 delete 来禁止拷贝和移动操作。delete拷贝和移动构造函数及赋值运算符可以防止对包含重要资源(如文件句柄、内存指针等)的类进行不当操作,这些资源不能被简单地复制或移动。例如,如果一个类管理一个文件句柄,简单的拷贝可能导致多个对象尝试关闭同一个句柄,导致未定义行为。
- 这意味着一旦一个类继承了 noncopyable,它就不能被复制或移动,确保了该类的对象是唯一的。
noncopyable类使用场景
- 资源管理:用于管理如文件、网络连接、线程等资源的类,确保这些资源在整个程序中只有一个有效实例。
- 单例模式:在单例模式中,通常会使用 noncopyable 来确保单例对象不能被复制。
- 自定义锁或智能指针:某些锁或智能指针实现中也会用到 noncopyable,以防止复制。
class FileWriter : public noncopyable {
public:
FileWriter(int x) : _x(x) {}
void write(int y) {
_x = y; // 写入操作
}
private:
int _x; // 数据成员
};
int main() {
FileWriter writer(2);
FileWriter writer2 = writer; // 错误,无法复制
FileWriter& w3 = writer; // 正常,可以引用
w3.write(5); // 正常,可以修改
return 0;
}
这里FileWriter继承了noncopyable,在FileWriter writer2 = writer 处之间编译报错,保证了FileWriter对象无法被复制,只能被引用。