Effective C++ 原著第3版

八重洲ブ本店。

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

*1
巻末付録に第2版と第3版の対応表があるのだが、項番号だけしか記されてなくわかりにくいので、タイトル込みの表にしとく。
とりあえず追加された項(1,8,9,15,17,25,29,35,42,43,45,46,47,48,55)だけ先に読んでおこう。第2版にあったものも内容は書き直されているとのことなので(あんど、以前第2版を読んだときはちんぷんかんぷんのものが多かったので…)、あとでちゃんと読もう。

3版 2版
タイトル タイトル
1 C++を複数の言語の連合と見なそう
2 #defi neより、const、enum、inlineを使おう 1 #define ではなく、const と inline を使おう
3 可能ならいつでもconstを使おう 21 使えるときは、必ず const を使おう
4 オブジェクトは、使う前に初期化しよう 12 コンストラクタでは、代入よりも初期化を使おう
13 初期化リストのメンバは、宣言した順に並べよう
47 非ローカルstaticオブジェクトは、使用前に必ず初期化されるようにしよう
5 C++が自動で書き、自動で呼び出す関数を知ろう 45 C++がどんな関数を黙って書き、呼び出しているか知っておこう
6 コンパイラが自動生成することを望まない関数は、使用を禁止しよう 27 暗黙のうちに生成される不要なメンバ関数は、明示的に使用を禁止しよう
7 ポリモーフィズムのための基底クラスには仮想デストラクタを宣言しよう 14 基底クラスには、仮想デストラクタを持たせよう
8 デストラクタから例外を投げないようにしよう
9 コンストラクタやデストラクタ内では決して仮想関数を呼び出さないようにしよう
10 代入演算子は*thisへの参照を戻すようにしよう 15 operator = を書くときは、*this へのリファレンスを返そう
11 operator=の実装では、自己代入に備えよう 17 operator = では、自分自身へ代入するケースをチェックしよう
12 コピーするときは、オブジェクトの全体をコピーしよう 16 operator = では、すべてのデータメンバに代入しよう
13 リソース管理にオブジェクトを使おう 6 デストラクタでポインタメンバにdelete を使うのを忘れないようにしよう
14 リソース管理クラスのコピーの振る舞いはよく考えて決めよう 11 メモリを動的に割り当てるクラスでは、コピーコンストラクタと代入演算子を宣言しよう
15 リソース管理クラスには、リソースそのものへのアクセス方法を付けよう
16 対応するnewとdeleteは同じ形のものを使おう 5 new と delete のペアは同じ形式に揃えよう
17 newで生成したオブジェクトをスマートポインタに渡すのは、独立したステートメ ントで行うようにしよう
18 インタフェースは、正しく使うときには使いやすく、間違った使い方では使いにくいものにしよう 46 ランタイムエラーよりは、コンパイル時やリンク時エラーのほうがいい
19 クラスのデザインを型のデザインとして考えよう (頁77-79)
20 値渡しよりconst参照渡しを使おう 22 値渡しよりも、リファレンス渡しを使おう
21 オブジェクトを戻すべき時に参照を戻そうとしないこと 23 オブジェクトを返さなければならないときに、リファレンスを変えそうとがんばるのはやめよう
31 関数は、ローカルオブジェクトへのリファレンスや関数の中でnew で初期化したポインタの参照先を返してはいけない
22 データメンバはprivate宣言しよう 20 データメンバをpublic インターフェースに入れるのはやめよう
23 メンバ関数より、メンバでもfriendでもない関数を使おう 18 クラスインターフェースが完全かつ最小限になるまでがんばろう
24 すべての引数に型変換が必要なら、メンバでない関数を宣言しよう 19 メンバ関数、非メンバ関数、friend関数を使い分けよう
25 例外を投げないswapを考えよう
26 変数の定義は可能な限り先延ばししよう 32 変数の定義は、できるだけ後回しにしよう
27 キャストは最小限にしよう 39 継承の階層構造を下る方向のキャスト(ダウンキャスト)は避けよう
28 オブジェクト内部のデータへの「ハンドル」を戻さないようにしよう 29 内部データのハンドルを返すのはやめよう
30 メンバ関数は、自分よりもアクセス制限がきついメンバへの非const ポインタや参照を返さないようにしよう
29 コードを例外安全なものにしよう
30 インラインをよく理解しよう 33 関数はよく考えてからインライン化しよう
31 ファイル間のコンパイル依存性をなるべく小さくしよう 34 コンパイルするファイル間の依存性はできるだけ減らそう
32 public継承はis-a関係を表すようにしよう 35 public に継承するときは、その一種である関係のモデルかどうか確認しよう
33 継承した名前を隠蔽しないようにしよう 9 普通の形式の new を隠蔽しないように注意しよう
34 インタフェースの継承と実装の継承の区別をしよう 36 インターフェースの継承と実装の継承とを区別しよう
35 仮想関数の代わりになるものを考えよう
36 非仮想関数を派生クラスで再定義しないこと 37 継承した非仮想関数を再定義してはならない
37 継承された関数のデフォルト引数値を再定義しない 38 継承したデフォルトパラーメータ値を再定義してはならない
38 コンポジションを使ってhas-a関係、is-implementedin-terms-of関係を作ろう 40 それを持っている関係や、それを実装手段とする関係は、層を重ねる形でモデル化しよう
39 private継承は賢く使おう 42 private な継承はよく考えてから使おう
40 多重継承は賢く使おう 43 多重継承は慎重に使おう
41 暗黙のインタフェースとコンパイルポリモーフィズムを理解しよう 41 継承とテンプレートの違いを理解しよう
42 typenameの2 つの意味を理解しよう
43 テンプレート化された基底クラス内の名前へのアクセス方法を知っておこう
44 パラメータに依存しないコードはテンプレートから外に出そう 42 private な継承はよく考えてから使おう
45 「すべての互換型」を受け取るためにメンバ関数テンプレートを使おう
46 型変換をさせたいなら、メンバでない関数をクラステンプレートの中で定義しよう
47 型の情報に関してはtraitsクラスを使おう
48 テンプレートメタプログラミングを意識しよう
49 new-handlerを理解しよう 7 メモリ不足に備えよう
50 どういうときにnewとdeleteの定義を自分で書くとよいか理解しよう 10 operator new を書くなら、operator delete も書こう
51 newとdeleteの定義を自分で書く場合はコンベンションに従おう 8 operator new と operator delete を書くときは規約を守ろう
52 プレースメントnewの定義を書いたらプレースメントdeleteの定義も書こう 9 普通の形式の new を隠蔽しないように注意しよう
53 コンパイラの警告に注意を払おう 48 コンパイラの警告に注意しよう
54 TR1 を含む標準ライブラリになじもう 49 標準ライブラリに精通しよう
55 Boostに親しもう

 
 

*1:2006/07/20読了