Effective C++读书笔记
--By Nathan.Yu 2007-11-14--
2 构造/析构/赋值运算(之二)
条款06:若不想使用编译器自动生成的函数,就该明确拒绝
【要点摘录】所有编译器生成的函数都是public且inline的。
如何阻止拷贝行为?
将copy构造函数和copy assignment操作符声明为private,并不去定义(实现)它们。借由明确声明一个成员函数,阻止了编译器暗自创建其专属版本;而令这些函数为private,可以阻止人们调用它;只声明而不实现,则如果在成员函数或friend函数中调用它们,会产生链接错误。
【扩展】C++ iostream就是使用这个方法来组织copying行为的。
一个更好的方法:
把链接期错误移至编译期,并可复用代码。即使用Uncopyable base class阻止拷贝:
class Uncopyable{
protected: //允许derived对象构造和析构
Uncopyable(){}
~Uncopyable(){} //不一定得是virtual
private:
Uncopyable(const Uncopyable&);//阻止copying
Uncopyable& operator=(const Uncopyable&);
};
/*
不含数据成员,符合EBO(empty base class optimization)资格
总是扮演base class角色,导致多重继承。而多重继承有时会阻止EBO。
Boost版本:noncopyable。
*/
class MyClass: private Uncopyable{ // 使用私有继承
………..
};
请记住:
为驳回编译器自动提供的机制,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。