5.1实用工具——noncopyable
原理
在C++定义一个类时,如果不明确定义拷贝构造函数和拷贝赋值操作符,编译器会默认为我们自动生成这两个函数,如下:
class empty_class
{
public:
empty_class(const empty_class &){}
empty_class& operator=(const empty_class &){}
};
为了禁止拷贝操作和赋值操作,所以将构造函数和拷贝赋值操作函数私有化,但是程序中如果出现大量这样的类,代码重复性太高,所以noncopyable为实现不可拷贝的类是从boost::noncopyable派生即可。
noncopyable类的源码
class noncopyable
{
protected:
#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)
BOOST_CONSTEXPR noncopyable() = default;
~noncopyable() = default;//默认的构造函数和析构函数,使用默认实现
#else
noncopyable() {} //默认的构造函数和析构函数是保护的,可继承
~noncopyable() {}
#endif
#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
noncopyable( const noncopyable& ) = delete;
noncopyable& operator=( const noncopyable& ) = delete;//禁用拷贝构造和拷贝赋值函数
#else
private: // emphasize the following members are private
noncopyable( const noncopyable& );
noncopyable& operator=( const noncopyable& ); //私有化拷贝构造和拷贝赋值函数
#endif
};
}
typedef noncopyable_::noncopyable noncopyable;