条款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的基类,本质上是一样的道理。

原文地址:https://www.cnblogs.com/benxintuzi/p/4527076.html