所有编译器产生出来的函数都是public。为了阻止编译器自动声明赋值操作符和赋值构造函数,可以声明这些函数为private。藉由明确声明一个成员函数,你阻止了编译器暗自创建其专属版本。令这些函数为private阻止别人调用它。
- class HomeForSale
- {
- public:
- ...
- private:
- ...
- HomeForSale(const HomeForSale&); //只有声明
- HomeForSale& operator=(const HomeForSale&);
- };
这个做法并不绝对安全,因为成员函数和friend函数还是可以调用你的private函数。
如果有人不慎调用了任何一个,会获得一个连接次错误(linkage error),“将成员函数声明为private而且故意不实现它们”
将连接期错误移至编译期是可能的,只要将copy构造函数和赋值操作符声明为private,不是自身,而是在基类中:
- class Uncopyable
- {
- protected:
- Uncopyable(){}
- ~Uncopyable(){}
- private:
- Uncopyable(const Uncopyable&);
- Uncopyable& operator=(const Uncopyable&);
- };
- //为了阻止HomeForSale对象被拷贝,我们唯一需要做的就是继承Uncopyable:
- class HomeForSale:private Uncopyable
- {
- ...
- };
为了驳回编译器自动提供的机能,可将相应的成员函数声明额外private并且不予实现,使用想Uncopyable这样的基类也是一种做法。