【プログラミング言語C++ by Bjarne Stroustrup】第3章 C++を探検しよう:抽象化のメカニズム

はじめに

クラス

  • 具象型
  • 抽象型
    • あとで定義される具象クラスの純粋なインターフェース
    • 実装の詳細には一切関与しない

  • クラス階層には以下に示す2つの利点がある
    • インターフェース継承(interface inheritance)
      • 派生クラスのオブジェクトは,基底クラスのオブジェクトが要求されるあらゆる箇所で利用できる
    • 実装継承(implementation inheritance)
      • 基底クラスは,派生クラスの実装を単純化する関数とデータを提供する.

コピーとムーブ

  • クラスを設計する際には,オブジェクトがコピーされる可能性とコピーの方法を必ず検討しなければならない.
    • 単純な具象型では,メンバ単位のコピーが正しいセマンティクス
    • Vectorのような高度な具象型では,メンバ単位のコピーは正しくない.
    • 抽象型では,メンバ単位のコピーはありえない.

  • クラスオブジェクトのコピー動作は2つのメンバとして定義される
    • コピーコンストラクタ(copy constructor)
    • コピー代入(copy assignment)

  • コンテナのコピーは高コストになりうる
    • 実際にはコピーしたい訳ではなくムーブしたいことが多い.

  • ムーブ
    • &&
      • 右辺値参照を意味する

  • コンテナのムーブ

  • 資源管理
  • 演算子の抑制
    • コピー演算,ムーブ演算を削除する

テンプレート

  • 一連の型や値をパラメータ化した,クラスもしくは関数であり,極めて汎用的な概念を表現する.
  • テンプレートに対して,要素型であるdoubleなどを引数として指定すると,その型に応じた関数が生成される.
  • テンプレートはコンパイル時のメカニズムなので,手作りのコードに比べて,実行時オーバーヘッドが増えることはない.

  • 関数オブジェクト

アドバイ

  1. アイディアは,そのままコード化しよう
  2. アプリケーションのコンセプトを,そのままコード化したクラスを定義しよう
  3. 単純な表現と厳しい性能とが求められる部品には,具象クラスを利用しよう
  4. 裸のnew演算子とdelete演算子は使わないように
  5. 資源管理には資源ハンドラとRAIIを利用しよう
  6. インターフェースと実装の完全分離が必要であれば,インターフェースとして抽象クラスを利用しよう
  7. 階層構造をもつ概念を表現するにはクラス階層を利用しよう
  8. クラス階層を設計する際は,実装継承とインターフェース継承を使い分けよう
  9. オブジェクトの構築,コピー,ムーブ,解体を制御しよう
  10. コンテナは値で返却しよう
  11. 強い資源安全を提供しよう.すなわち,資源とみなせるものをリークさせてはいけない.
  12. 同じ型の値を複数持つ場合は,資源ハンドラのテンプレートとして定義されたコンテナを利用しよう
  13. 汎用的なアルゴリズムは,関数テンプレートとして実現しよう
  14. ポリシーと実行は,ラムダ式を使う関数オブジェクトとして実現しよう
  15. 違いが少ない型や実装には,型とテンプレートに別名を与えることで,統一化された記法を実現しよう.