条項06:コンパイラによって自動的に生成される関数を使用したくない場合は、明示的に拒否する


すべてのコンパイラで生成された関数はpublicです.コンパイラが割り当てオペレータと割り当て構造関数を自動的に宣言しないようにするには、privateとして宣言します.メンバー関数を明確に宣言することで、コンパイラが独自のバージョンをひそかに作成することを阻止します.これらの関数をprivateとして呼び出しを阻止します.

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

この方法は、メンバー関数とfriend関数がprivate関数を呼び出すことができるため、絶対に安全ではありません.
いずれかを不注意で呼び出すと、「メンバー関数を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のようなベースクラスを使用するのも1つの方法です.