所有编译器产生出来的函数都是public。为了阻止编译器自动声明赋值操作符和赋值构造函数,可以声明这些函数为private。藉由明确声明一个成员函数,你阻止了编译器暗自创建其专属版本。令这些函数为private阻止别人调用它。

  1. class HomeForSale 
  2. public
  3.   ... 
  4. private
  5.   ... 
  6.   HomeForSale(const HomeForSale&);  //只有声明
  7.   HomeForSale& operator=(const HomeForSale&); 
  8. }; 

这个做法并不绝对安全,因为成员函数和friend函数还是可以调用你的private函数。

如果有人不慎调用了任何一个,会获得一个连接次错误(linkage error),“将成员函数声明为private而且故意不实现它们”

 

将连接期错误移至编译期是可能的,只要将copy构造函数和赋值操作符声明为private,不是自身,而是在基类中:

  1. class Uncopyable 
  2. protected
  3.   Uncopyable(){} 
  4.   ~Uncopyable(){} 
  5. private
  6.   Uncopyable(const Uncopyable&); 
  7.   Uncopyable& operator=(const Uncopyable&); 
  8. }; 
  9. //为了阻止HomeForSale对象被拷贝,我们唯一需要做的就是继承Uncopyable: 
  10. class HomeForSale:private Uncopyable 
  11.    ... 
  12. }; 

 

 

为了驳回编译器自动提供的机能,可将相应的成员函数声明额外private并且不予实现,使用想Uncopyable这样的基类也是一种做法。