条款6:显式拒绝编译器生成的默认函数

如果一个对象是独一无二的,那么我们就不应该提供copy构造函数和copy assignment操作符函数(二者统称为copying函数)。但是即使我们不定义它们,编译器也会在别人调用它们时默认提供,如何拒绝编译器的这种行为呢?

由于编译器自动生成的函数都是public的,因此你可以提privatecopying函数,而不实现它们,这样做有如下3点好处:

1>  防止编译器自动生成这些函数。

2>  声明为private可以阻止外部人员调用它们。

3>  只声明不实现可以防止member函数和firend函数调用它们。

 

C++ iostream标准库中防止copying行为的做法就是这样的,类似于如下定义:

 1 class Uncopy

 2 {

 3 public:

 4     Uncopy();

 5   ~Uncopy();

 6 

 7 private:

 8     Uncopy(const Uncopy& rhs);              // 只声明不实现

 9     Uncopy& operator=(const Uncopy& rhs);   // 只声明不实现

10 };

11 Uncopy::Uncopy(){ }

12 Uncopy::~Uncopy(){ }

 

 

如果外部有人调用copying函数的话,会在链接期间发生错误。还有一种办法是将错误提示转移至编译期,这样可以尽早做出响应,具体为:将私有的copying函数在基类中声明,让派生类来做具体业务,如下所示:

 1 class Uncopyable

 2 {

 3 public:

 4     Uncopyable();

 5     ~Uncopyable();

 6 

 7 private:

 8     Uncopyable(const Uncopyable& rhs);              // 只声明不实现

 9     Uncopyable& operator=(const Uncopyable& rhs);   // 只声明不实现

10 };

11 Uncopyable::Uncopyable(){ }

12 Uncopyable::~Uncopyable(){ }

13 

14 class DecCopy : private Uncopyable

15 {

16     

17 };

当我们调用DecCopy的copying函数时,编译器试图生成这些函数,进而尝试调用其基类的copying函数,碰到private后,终止生成过程。

 

总结:

为了防止编译器自动生成函数,可将对应的函数声明为private而不实现它们;或者使用类似于Uncopyable的基类,本质上是一样的道理。

 

你可能感兴趣的:(编译器)