防止类对象被拷贝的方法
class HomeForSale {
public:...
private:...HomeForSale(const HomeForSale&); // declarations onlyHomeForSale& operator=(const HomeForSale&);
};
- 私有拷贝构造函数和赋值运算符:将拷贝构造函数和拷贝赋值运算符声明为私有并不予实现,这样编译器就不会自动生成默认的拷贝构造函数和拷贝赋值运算符,从而阻止类对象被拷贝。如在
HomeForSale
类中,将拷贝构造函数和拷贝赋值运算符声明为私有,编译器会阻止客户的拷贝企图,若在成员或友元函数中进行拷贝操作,在连接时会出现错误。 -
class Uncopyable {
protected: // allow constructionUncopyable() {} // and destruction of~Uncopyable() {} // derived objects...private:Uncopyable(const Uncopyable&); // ...but prevent copyingUncopyable& operator=(const Uncopyable&);
};
- 使用 Uncopyable 基类:创建一个
Uncopyable
基类,在其中将拷贝构造函数和拷贝赋值运算符声明为私有且不实现,然后让需要防止拷贝的类从Uncopyable
类私有继承。这样,当试图拷贝派生类对象时,编译器生成的拷贝函数会调用基类的私有拷贝函数,从而导致编译错误,可将连接时错误提前到编译时。 -
class HomeForSale: private Uncopyable { // class no longer... // declares copy ctor or
}; // copy assign. operator
相关注意事项
- 函数参数名惯例:在声明私有拷贝构造函数和拷贝赋值运算符时,通常可以省略函数参数的名字,因为这些函数一般不会被实现和使用2。
- Uncopyable 类的特性:
- 继承方式:从
Uncopyable
继承不必是公有继承,可根据具体情况选择合适的继承方式。 - 析构函数:
Uncopyable
的析构函数不必是虚拟的,因为其本身可能不需要作为多态基类。 - 空基类优化:由于
Uncopyable
不包含数据,符合空基类优化的条件,但在使用时需注意不能引入多继承,因为多继承可能会使空基类优化失效。
- Boost 中的 noncopyable 类:Boost 提供了
noncopyable
类,功能与Uncopyable
类似,可以使用该类来更方便地实现防止类对象被拷贝的功能。