声明:
- 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。
- 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。
Effective C++之条款06:若不想使用编译器自动生成的函数,就该明确拒绝
Explicitly disallow the use of compiler-generated functions you do now want.
直接进入正题。
引子:地产中介商卖的每一套房子都是独一无二,因此待售房屋之间不应该存在拷贝关系。而如果不声明拷贝构造函数和拷贝赋值运算符,那么当有人尝试调用它们时编译器就会为你生成它们。所以,现在就要阻止coping!
可以将拷贝构造函数和拷贝赋值运算符声明为private,这样就阻止了编译器暗自创建其专属版本。不过这个做饭并非绝对安全,因为member和friend函数还是可以调用private函数。
将成员函数声明为private而不去实现它们,这种做法颇为大家接受,eg:
class HomeForSale
{
public:
...
private:
...
HomeForSale(const HomeForSale&);
HomeForSale& operator=(const HomeForSale&);
};
有了上述class定义,当客户企图拷贝HomeForSale对象,编译器会阻挠;而如果在member或者friend函数中拷贝,那么链接器就会发出抱怨。
然而,将链接器错误移动至编译器可以更早侦测出错误。通过一个专门为了阻止copying动作而设计的base class就可以做到。为求HomeForSale对象被拷贝,我们唯一要做的就是继承Uncopyable。eg:
class Uncopyable
{
protected:
//允许derived对象构造和析构
Uncopyable(){ }
~Uncopyable(){ }
private:
//但阻止copying
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
}
class HomeForSale:private Uncopyable
{
...
};
注意:Uncopyable class不一定得以public继承,以及其析构函数不一定是virtual。
请记住:
为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种好的做法。