C++禁止拷贝/移动的类

本文介绍了如何在C++中使用模板创建类,使其既不可复制也不可移动,通过提供删除的构造函数和赋值操作符实现。实例展示了在实际项目中禁用拷贝和移动构造的类及其应用。
摘要由CSDN通过智能技术生成

熟悉c++的朋友都知道,类有两个构造函数,拷贝构造移动构造。可是,在实际项目中,某些类可能希望禁止复制或移动,例如一个定义资源管理类,或者一个单例模式类。

怎么实现这样一个类呢?这篇文章将实现这样一个模板。方便您可以直接粘贴到你的项目中使用。

我们来定义一个禁止复制的类的模版:

class NonCopyable {
 public:
  NonCopyable() {}
  NonCopyable(NonCopyable &&) {}
  NonCopyable &operator=(NonCopyable &&) { return *this; }

 private:
  NonCopyable(const NonCopyable &) = delete;
  NonCopyable& operator=(const NonCopyable &) = delete;
};

我们来测试一下这个基类:

class csdn : NonCopyable {
};

int main() {
    csdn c1;
    csdn c2(c1);
    return 0;
}

g++ -o a -std=c++11 nocopy.cpp 编译一下得到这个结果:

nocopy.cpp: In function \u2018int main()\u2019:
nocopy.cpp:27:15: error: use of deleted function \u2018csdn::csdn(const csdn&)\u2019
   27 |     csdn c2(c1);
      |               ^
nocopy.cpp:22:7: note: \u2018csdn::csdn(const csdn&)\u2019 is implicitly deleted because the default definition would be ill-formed:
   22 | class csdn : NonCopyable {
      |       ^~~~
nocopy.cpp:22:7: error: use of deleted function \u2018NonCopyable::NonCopyable(const NonCopyable&)\u2019
nocopy.cpp:8:3: note: declared here
    8 |   NonCopyable(const NonCopyable &) = delete;
      |   ^~~~~~~~~~~

报错信息显示拷贝构造函数已经被删除了。无法编译成果。

下面我们来实现一个禁止移动的类:

class NonMovable {
 protected:
  NonMovable() {}
  ~NonMovable() {}

 private:
  NonMovable(NonMovable &&) = delete;
  NonMovable& operator=(NonMovable &&) = delete;
};

测试一下:

class csdn : NonMovable {
};

int main() {
    csdn c1;
    csdn c2 = std::move(c1);
    return 0;
}
nomovable.cpp: In function \u2018int main()\u2019:
nomovable.cpp:29:27: error: use of deleted function \u2018csdn::csdn(csdn&&)\u2019
   29 |     csdn c2 = std::move(c1);
      |                           ^
nomovable.cpp:24:7: note: \u2018csdn::csdn(csdn&&)\u2019 is implicitly deleted because the default definition would be ill-formed:
   24 | class csdn : NonMovable {
      |       ^~~~
nomovable.cpp:24:7: error: use of deleted function \u2018NonMovable::NonMovable(NonMovable&&)\u2019
nomovable.cpp:20:3: note: declared here
   20 |   NonMovable(NonMovable &&) = delete;
      |   ^~~~~~~~~~

下面定义一个禁止复制和移动的类:

class NonCopyOrMovable {
 protected:
  NonCopyOrMovable() {}
  ~NonCopyOrMovable() {}

 private:
  NonCopyOrMovable(const NonCopyOrMovable &) = delete;
  NonCopyOrMovable(NonCopyOrMovable &&) = delete;
  NonCopyOrMovable& operator=(const NonCopyOrMovable &) = delete;
  NonCopyOrMovable& operator=(NonCopyOrMovable &&) = delete;
};

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值