将成员函数设为private,并不予实现
由于所有的编译器产出都是public
,为阻止这些函数被创建出来,我们得自己声明他们,我们可以将copy
构造函数或copy assignment
操作符声明为private
。藉由明确声明一个成员函数,我们就可以组织编译器暗自创建其专属版本,而令这些函数为private
则可以阻止别人调用它。
但是一般而言这样的做法并不是绝对安全的,因为member
函数和friend
函数还是可以调用private
函数,有一种做法就是将成员函数声明为private
并且故意不实现他们:
class HomeForSale {
public:
...
private:
...
HomeForSale(const HomeForSale&); //只有声明,没有实现
HomeForSale& operator=(const HomeForSale&);
}
有了上述的class
定义,当客户企图拷贝HomeForSale
对象,编译器会阻挠他。
使用一个base class
但是如果你不小心在member
函数或friend
函数之内这么做的话,就会在连接器的位置出现问题,将连接期间的错误移至编译期是可能的,只需要将copy
构造函数和copy assignment
操作符声明为private
就可以办到,但不是在HomeForSale
自身,而是在一个专门为了阻止copying
动作而设计的base class
内。这个base class
非常简单:
class Uncopyable {
protected:
Uncopyable() {} //允许derived对象构造和析构
~Uncopyable() {}
private:
Uncopyable(const Uncopyable&); //但阻止copying
Uncopyable& operator=(const Uncopyable)
}
请记住
为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明private并且不予实现。使用像Uncopyable这样的base class也是一种做法