如果要禁用编译器自动产生的copy ctor和拷贝构造函数,一般用下面的方法:
class UniqueMoo { public: ... private: UniqueMoo(const UniqueMoo&); // 1. 只声明不定义,而且声明为私有,即可 UniqueMoo& operator = (const UniqueMoo&); // 1. 防止客户调用。用则产生编译错。若用 }; // 1. 于成员函数或友元函数,则产生链接错。
更明智的办法是定义一个空的基类:
class Uncopyable { protected: Uncopyable() {} ~Uncopyable() {} // 2. 虽然可派生,但不需要virtual private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); }; class UniqueMoo: private Uncopyable { // 3. 私有继承比较好 ... };
1> 当客户/成员函数/友元函数要拷贝UniqueMoo对象时,编译器自动调用Uncopyable的拷贝函数,于是产生编译错误。
2> Uncopyable没有成员变量,所以在单重继承时,一般会有empty base class optimization。多重继承时则一般没有。
3> Boost里有现成的实现:noncopyable
本文介绍如何通过声明私有的拷贝构造函数和赋值运算符来禁止类的对象被拷贝。此外,还提供了一个基类Uncopyable的实现方式,以帮助避免无意中的拷贝行为。

被折叠的 条评论
为什么被折叠?



