Effective C++読書ノート(一)

5780 ワード

Effective C++読書ノート(一)
1、C++に慣れる
条項01:C++を一つの言語連邦と見なす
C++の4つの階層:
  • C:C++はC言語に基づいて発展した
  • である.
  • Object-Oriented C+:C++のCとは異なる部分です.ここでは主にオブジェクト向けを指します.
  • Template C+::C++の汎用プログラミング.
  • STL:これは標準テンプレートライブラリで、テンプレートで多くのコンテナ、反復器、アルゴリズムを実現しています.STLを使用すると、往々にして仕事が半分になります.

  • 条項02:できるだけconst、enum、inlineで#defineを置き換える
  • constメリット
  • define直接定数置換、コンパイルエラーが発生し位置決めしにくい(定数がどの変数なのか分からない)
  • defineはアクティブドメインを持たず、constアクティブドメインはパッケージ性
  • を提供する.
  • enumのメリット:
  • はパッケージ性
  • を提供する.
  • コンパイラでは、追加のメモリ領域は割り当てられません(constでは割り当てられません).
  • inlineのメリット:
  • defineマクロ関数は誤用を招きやすい(以下の例)
    //define    
    
    #define MAX(a, b) a > b ? a : b
    
    int a = 5, b = 0;
    MAX(++a, b) //a++  2 
    MAX(++a, b+10) //a++    
    
  • 注意:
  • 単純な定数については、#define
  • をconstオブジェクトまたはenumsで置き換えることが望ましい.
  • 類似関数のマクロについては、インライン関数
  • に変更することが望ましい.

    条項03:できるだけconstを使用する
  • const修飾変数は
  • の変更を許さない.
  • 注意ポインタ定数と定数ポインタ、stlの反復器類似ポインタ(T*const point、指す要素は変更可能)
  • constメンバー関数
  • クラス内のどのメンバー関数がデータ・メンバー
  • を変更できるかを確認できます.
  • constオブジェクトはconstオブジェクトメンバー関数のみを呼び出すことができ、非constオブジェクトは通常のメンバー関数もconstメンバー関数も呼び出すことができます(これはthisポインタがconst thisに変換できるためですが、const thisは非const thisに変換できません)
  • 1関数はconstがリロード可能な
  • であるかどうか
  • ポインタが指すオブジェクトを変更したメンバーオブジェクトはconstではありませんが、ポインタのみがオブジェクトに属する場合、コンパイラの異議は発生しません.
  • mutableキーワードで修飾されたメンバー変数は、const関数の
  • でも常に可変状態になります.
  • constと非constメンバーの機能が類似している場合、非constバージョンでconstバージョンを呼び出し、コードコピーを回避します.
    
    class CTextBlock{
    public:
    	const char& operator[](std::size_t position)const
    	{
            ...
    		return pText[position];
    	}
    	char& operator[](std::size_t position)
    	{
    		return const_cast<char&>(static_cast<const CTextBlock&>(*this)[position]);
    	}
    	char * pText;
    	int length;
    


  • 条項04:オブジェクトが使用される前に初期化されたことを確認する
  • は0に初期化する場合があり、
  • に初期化されない場合がある.
  • 内蔵タイプ、手動初期化
  • 内蔵以外のタイプ、コンストラクタ初期化
  • 構造関数の体内は付与値であり、初期化リストでは初期化
  • である.
  • 初期化順序は宣言順序と一致する
  • である.
  • 初期化の効率は付与値より高い
  • 賦値は、まず変数を定義し、定義時に呼び出された変数のデフォルト構造関数の後に賦値オペレータを使用する.
  • 初期化時にコピーコンストラクタ
  • が直接呼び出された.
  • const、参照、ベースクラスパラメータ(ベースクラスが派生クラスより先に初期化されているため)、オブジェクトメンバーは、初期化リストの
  • にある必要がある.

  • 関数内のstaticオブジェクトはlocal staticオブジェクトであり、他のstaticオブジェクトはnon-local staticオブジェクトである
  • 異なるコンパイルユニット内のnon-local staticオブジェクトを定義する初期化順序は明確でない
  • .
  • staticオブジェクトはコピーが1部しかなく、local staticオブジェクトを一度だけ初期化(単例モードと同様)して使用し、初回使用時に初期化し、その参照を返せばよい(local static宣言サイクルはプログラム全体)が、後で再初期化する必要はありません.

  • まとめ:
  • 手動初期化non-memberオブジェクト
  • 初期化リストを使用してmemberオブジェクトを初期化します.
  • は、初期化順序の不確実性を除去する.