标签:
如果一个对象是独一无二的,那么我们就不应该提供copy构造函数和copy assignment操作符函数(二者统称为copying函数)。但是即使我们不定义它们,编译器也会在别人调用它们时默认提供,如何拒绝编译器的这种行为呢?
由于编译器自动生成的函数都是public的,因此你可以提供private的copying函数,而不实现它们,这样做有如下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的基类,本质上是一样的道理。
标签:
原文地址:http://www.cnblogs.com/benxintuzi/p/4527076.html