假如有一个类HomeForSale,,但是我们不允许任何对HomeForSale类的复制,我们可以显式地将HomeForSale的赋值构造函数和 "= "操作符重载函数设为private,并且不去定义它(不写出函数体)。
例如:
class HomeForSale
{
public:
//...
private:
//...
HomeForSale(const HomeForSale&);//这里没写参数名称是因为这两个函数以后都不会被用到
HomeForSale& operator=(const HomeForSale&);//所以没必要写参数名。
};
//并且后面不实现这两个函数
当客户企图拷贝 HomeForSale对象时,编译器会报错。如果在成员函数会friend函数内引用这两个函数,连接器会报错,因为这两个函数没有实现。
以下的做法可以吧连接期的错误提前到编译期报错:
class Uncopyable
{
protected:
Uncopyable() {}; //允许派生类对象构造和析构
~Uncopyable() {};
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator= (const Uncopyable&);
};
为防止HomeForSale对象被拷贝,可以继承Uncopyable类
class HomeForSale: private Uncopyable
{
//class 不再声明复制构造函数和复制赋值操作符"=",但仍要声明构造函数和析构函数,因为private复制会使Uncopyable中的构造函数和析构函数变成privte
};
因为使用private继承,所以基类Uncopyable的函数(复制构造函数)不能被调用,若调用会在编译时报错。