C++武器库之noncopyable类


我是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类实现思路

  1. 构造函数和析构函数保护.
  • 构造函数和析构函数被声明为 protected,这意味着只有派生类可以直接实例化和销毁 noncopyable 的对象,不能在外部直接使用 new noncopyable()。
  • 这样设计的目的是防止直接实例化 noncopyable 类,确保它只被用于作为基类。
  1. 禁止拷贝和移动
  • 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对象无法被复制,只能被引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值