4.1 noncopyable
noncopyable允许程序轻松的实现一个禁止拷贝的类
位于命名空间boost,需要包含头文件<boost/noncopyable.hpp>或者<boost/utility.hpp>
#include <boost/noncopyable.hpp>
#include <boost/utility.hpp>
原理:
在定义一个类的时候,如果不明确定义拷贝构造函数和拷贝复制函数,编译器会为我们自动生成这两个函数,一般情况这是有用的,比如可以自动支持swap(),符合容器的拷贝语义,可以放入标准容器处理,但有时候我们不需要类的拷贝语义,希望禁止拷贝类的实例。
有一个很经典的c++惯用法,只需要私有化拷贝构造函数和拷贝赋值操作符即可,列如:
class do_not_copy
{
private:
do_not_vopy(const do_not_copy &);
void operator=(const do_not_copy &);
};
但如果程序中有大量这样的类,重复写这样的代码相当乏味,而且代码出现的次数越多越增大出错的几率。
用法
从boost::noncopyable派生即可,列如:
#include <boost/noncopyable.hpp>
class do_not_copy: boost::noncopyable
{...};
这里使用缺省的私有继承是允许的,我们可以显示的写出private或者public修饰词,但效果是相同的,因此可以直接少输入一些代码,并表明了has-a关系。
若果有人企图拷贝构造或者赋值do_not_copy,那么将不能通过编译器:
do_not_copy d1; //一个不可拷贝的对象
do_not_copy d2(d1); //企图拷贝构造,编译出错
do_not_copy d3; //一个不可拷贝的对象
d3 = d1; //企图拷贝赋值,编译出错
实现
class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private:
noncopyable(const noncopyable &);
const noncopyable& operator= (const noncopyable&) = delete;
};
当我们的自定义类是noncopyable的子类时回自动私有化父类noncopyable的拷贝构造函数从而禁止用户从外部访问拷贝构造函数和沟北赋值函数。
如果使用c++11标准的新default和delete关键字,则noncopyable可以更清晰的实现如下:
class noncopyable
{
protected:
noncopyable() = default;
~noncopyable() = defalult;
noncopyable(const noncopyable &) = delete;
noncopyable& operator=(const noncopyable& ) = delete;
};
原文:https://www.cnblogs.com/kloseer/p/12057287.html