Effective C++条項5、6、7

2206 ワード

条項5 C++黙々と作成して呼び出す関数を理解する
1、デフォルトの構造関数Empty()
2、コピーコンストラクタEmpty(const Empty&rhs){...}
3、コピー付与オペレータEmpty&operator=(const Empty&rhs){}(ただし、付与(または付与複合)オペレータはすべてreference to*thisを返し、条項10を参照)
4、解析関数~Empty(){...}
5、移動構造関数Empty(Empty&&rhs){...}に対して、コンストラクション関数をカスタマイズすれば、コンパイラは移動コンストラクション関数を自動的に合成することはありません(基本タイプでは本物の移動ではなく「コピー」なので、その1つのコンストラクションさえあれば、もう1つのリソースもなくなります.したがって、コンストラクション関数を定義すれば、移動コンストラクションは合成されません~).
6、移動付与オペレータEmpty&operator=(Empty&&rhs)について、理由は同じです.
条項6コンパイラが自動的に生成する関数を使用したくない場合は、明確に拒否する
拒否の方法は次の2つです.
1、copyコンストラクション関数またはcopy付与オペレータをprivateで宣言するだけでよい.これにより、コンパイラは呼び出しを動的に拒否する(defaultコンストラクション、copyコンストラクション、copy付与関数はコンパイラが自動的に生成する関数であるため)
2、もちろん、C 11規格では、例えばEmpty(const Empty&rhs)=deleteを用いることができる.で、このcopyコンストラクション関数の呼び出しを明確に拒否します.
3、プライベート継承のUncopyableのようなbase classを選ぶのは素晴らしい運用です.
class Uncopyable {
protected:
	Uncopyable(){}
	~Uncopyable(){}
private:
	Uncopyable(const Uncopyable&);
	Uncopyable& operator=(const Uncopyable);
};
//    
class HomeForSale:private Uncopyable{};//class     copy     copy assginment   

条項7マルチステートベースクラス宣言virtual構造関数
1、C++は、derived classオブジェクトが1つのbase classポインタを介して削除され、そのbass classがnon-virtual分析関数を持っている場合、その結果は定義されていないことを明確に指摘している(すなわち、実際に実行された場合、通常はオブジェクトのderived成分が破棄されていない).
解決策は簡単です.bass classにvirtual構造関数を与えます.
2、classはvirtual関数を含まない.通常、base classとして使用されることを意図していないことを示す.classがbase classとしてその構造関数をvirtualとすることを意図しない場合は、往々にしてくだらない考えである(本ではよく説明されているが、よく知っているようで分からないので、この準則を黙認し、「くだらない考え」である).
直接言えば、構造関数にvirtualキーワードが必要な場合に追加されます.そうしないと、蛇に足を添わないでください.
使用心得:classに少なくとも1つのvirtual関数が含まれている場合、構造関数はvirtual関数として宣言されます.
3、クラスを継承しますが、このような構造関数はvirtualキーワードで修飾されていません.同じ災害です(次の災害コードを参照).したがって、STLライブラリ内のクラスは、他のクラスを派生させるためには使用されません.
class SpecialString :public string {};//        ,  string  non-virtual    
SpecialString* pss = new SpecialString("Impending Doom");
string* ps;
...
ps = pss;//SpecialString* => string*
...
delete ps;//    !   *ps SpecialString     ,  SpecialString        

以下の内容はすべてScott Meyers大師の著Effective C++version 3から来て、もし間違いの地方があるならば、指摘を歓迎します!お互いに勉强して、促进します!!