如果我们不想使用编译器自动生成的函数,但是你自己又不想提供自己编写的这些编译器可以自动生成的函数给自己或别人使用,此时,你可以将自己编写的这些函数声明为private。
我们有一个class HomeForSale,但是我们不希望别人使用HomeForSale中的copy 构造函数和copy assignment操作符,我们可以这样设计此类。
class HomeForSale
{
public:
HomeForSale( double price ) : m_HomePrice(price)
{
}
void ShowPrice();
private:
HomeForSale( const HomeForSale& ); //仅仅声明
HomeForSale operator&(const HomeForSale&);
private:
double m_HomePrice;
};
但此时,我们在ShowPrice()中做了一个Copy操作:
void HomeForSale::ShowPrice()
{
HomeForSale MyHome(*this);
cout << MyHome.m_HomePrice << endl;
}
在vc6.0编译器下会报链接错误:
error LNK2001: unresolved external symbol "private: __thiscall HomeForSale::HomeForSale(class HomeForSale const &)" (??0HomeForSale@@AAE@ABV0@@Z)
因为我们调用了只是声明了的Copy构造函数;
为了尽早发现错误,我们可以将连接期错误移至编译期,这样我们也可以更容易解决问题,我们重新设计此类,并为其设计一个父类,将父类中的Copy构造函数和copy assignment操作符设置为private,这个父类完全是为了阻止copying动作而设计的:
class Uncopyable
{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&){}
Uncopyable &operator=(const Uncopyable&){}
};
class HomeForSale : private Uncopyable
{
public:
HomeForSale( double price ) : m_HomePrice(price)
{
}
void ShowPrice();
private:
double m_HomePrice;
};
void HomeForSale::ShowPrice()
{
HomeForSale MyHome(*this);
cout << MyHome.m_HomePrice << endl;
}
在vc6.0编译器下会报编译错误:
error C2558: class 'HomeForSale' : no copy constructor available
这样,如果不小心调用了我们更容易找到问题出现在哪里。