C++ コーディングメモ
目次
サイトリンク
- コーディングスタイル
- リファレンス
- 学習
- Tips
インタフェース
インタフェースクラス
- 派生クラスをインタフェースクラスにアップキャストする
- 実行時に動的にポリモーフィズムを達成
テンプレート
- テンプレートは静的(コンパイル時計算)ポリモーフィズム
- 継承は移譲 + テンプレートで書けることがある
- コンパイル時の注意
- テンプレートの定義はヘッダファイルに書く
- 多重インクルードエラーは inline で回避
- テンプレートと純粋仮想関数は両立不可:テンプレートはコンパイル時にコード生成するが、純粋仮想関数は実行時に動的呼び出しを行うため
- 各種テクニック
Tips
- 右辺値参照と左辺値参照
- 右辺値は名前無し一時オブジェクト
- 左辺値は名前有り実態のあるオブジェクト
- Range based for と auto&& による perfect forwarding
- キャストは C++ の機能で
- static_cast
- dynamic_cast
- ループで使う変数はループ内で宣言, 例外は以下(Effective C++ §26)
- 効率化重視
- 代入が生成と破棄よりもローコスト
- ループ回数が多い
- 巨大なコピーを避ける
- 巨大な(組み込み型等以外の)変数は const 参照で(Effective C++ §20)
- 出力の参照渡しとポインタ渡しの比較
- ポインタ渡しだと使わない戻り値を宣言しなくてよい
- ポインタ渡しだと nullptr チェックが必要
- ローカル変数の戻り値は値渡しで RVO, NRVO 任せ(Effective C++ §21)
- メンバイニシャライザを有効活用
- コンストラクタによる初期化よりも速い
- 宣言順での初期化に注意
- 一様初期化構文(波カッコによる初期化子リスト)を有効活用
- デフォルト引数の設定はヘッダで行う
class hoge{
public:
double method(double arg = 1.);
};
double hoge::method(double arg){
...
}
- ラムダ式:単一の関数内で同一の処理が繰り返される場合など
void func(double a){
auto f = [a](double x){
return pow(x,a);
};
auto df = [a](double x){
return a*pow(x, a-1);
};
double value = f(10.) + df(10.) * 10.;
...
}
- マクロの正しい使い方:条件付きコンパイルなど
- アライメントとパディング