类 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