Effective C++之条款06:若不想使用编译器自动生成的函数,就该明确拒绝

声明:

  1. 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。
  2. 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。

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也是一种好的做法。

猜你喜欢

转载自blog.csdn.net/longmenshenhua/article/details/88683107