条款 1:C++ を言語連邦として扱う#
手続き、オブジェクト、テンプレート、関数の 4 つのプログラミングパラダイムに加えて、ジェネリックプログラミングの形式であるメタプログラミングもあります。STL はメタプログラミングの典型です。
- C++ を学ぶための方法を体験できます。
条款 2:#define の代わりに const/enum/inline を使用する#
可能な限り #define を使用せず、デバッグのために const/enum/inline を使用します。#define を使用すると、エラーが隠れやすくなります。
- 単なる定数の場合は、const オブジェクトまたは enum を使用するのが最善です。
- 関数のようなマクロの場合は、インライン関数を使用するのが最善です。
条款 3:可能な限り const を使用する#
データの意味上の const vs. 論理的な意味上の const
- コンパイラは前者を強制しますが、プログラムを書く際には後者を使用します。
- 前者:データの意味上の const は実現が難しく、ポインタを介してデータが変更される可能性があります。
- 後者:コアデータが変更されていない場合、論理的な意味上の const と見なすことができます。
PS:const オブジェクトとメソッド
- const オブジェクト:非 const メソッドを呼び出すことはできません。非 const メソッド内の変数は変更される可能性があるためです。
- const メソッド
- メンバー属性を変更することはできません。
- mutable 変数:論理的な意味上の const であり、変数は変更可能ですが、コアデータではありません。
条款 4:オブジェクトが使用される前に初期化されていることを確認する#
- 組み込み型オブジェクトを手動で初期化する
- C++ は組み込み型オブジェクトの初期化を保証しません。
- コンストラクタの代入は初期化リストを使用するのが最善です。
- 初期化リストはコンストラクタを呼び出します。
- コンストラクタと代入演算子は C++ では完全に異なる概念です。
- コンストラクタは主にオブジェクトの初期化に責任を持ちます。
- 初期化リストには、クラス内での宣言の順序と同じ順序でメンバーがリストアップされるべきです。
- 見た順序が実際の順序であり、メンテナンスが容易です。
- 逆に書いても、プログラムは宣言の順序で変数を初期化します。
- "クロスコンパイルユニットの初期化順序の問題" を減らすために、non-local static オブジェクトを local static オブジェクトで置き換えます。
- ファイル間の初期化の依存関係を最小限にします。