boost::noncopyable 的用法

类 noncopyable

类 noncopyable 是一个基类。当你想禁止复制构造和复制赋值时,可以从 noncopyable 派生你的类。

有些对象,持有象文件和网络连接这样的复杂资源,它们没有明确的复制语义。有时候可能会有复制语义,不过也只有非常有限的用处,而且要正确地实现也非常困难。有时候你是在实现一个没有复制必要的类,你也不想花时间去写这些函数。从 noncopyable 进行派生可以防止其它隐式生成的函数(它们不具备正确的语义)成为其它程序员的陷阱。

处理这一情况的传统方法是声明一个私有的复制构造函数和赋值函数,并写明为什么这样做。不过从 noncopyable 进行派生更简单也更清晰,不需要其它说明。

 

例子

// 在你的某个头文件中 ...
#include <boost/utility.hpp>

class ResourceLadenFileSystem : boost::noncopyable {
...

原理

类 noncopyable 带有保护的构造函数和析构函数,以强调它只被用作基类。Dave Abrahams 提到了增加(即使是简单的内联函数)析构函数声明对于编译器优化的影响。他说 "可能这个担心是错误的,因为 noncopyable 在大多数情况下是用于拥有资源的类,它们通常都会有一个非平凡的析构语义。"

 

 


#include <boost/noncopyable.hpp>
#include <iostream>

//  This program demonstrates compiler errors resulting from trying to copy
//  construct or copy assign a class object derived from class noncopyable.

namespace
{
    class DontTreadOnMe : private boost::noncopyable
    {
    public:
         DontTreadOnMe() { std::cout << "defanged!" << std::endl; }
    };   // DontTreadOnMe

}   // unnamed namespace

int main()
{
    DontTreadOnMe object1;
    DontTreadOnMe object2(object1);    //error
    object1 = object2;                //error
    return 0;
}   // main
  

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值