C++ オブジェクト指向メモ
目次
設計
関数設計
- 修飾子の方針
- 名前空間内関数:外部変数未使用
- 静的メンバ関数:静的メンバ変数を利用
- const メンバ関数:メンバ変数を読み取り専用で利用
- 通常のメンバ関数:メンバ変数を変更
- 引数・返り値の方針
- 関数の成否:必要であれば返り値は bool
- 入出力用の引数があるか(引数を in-place に変更するか):あればポインタ型で与える
- 入力用引数は const 参照で、残りは std::tuple で返す(不要な戻り値は std::ignore で無視)
-
アクセサの例
// セッター inline void setter(const vector<double>& member) { this->member = member }; // メソッドチェインが可能なセッター inline ExampleClass& setter(const vector<double>& member) { this->member = member; return *this; } // ゲッター inline const vector<double>& getter(void) const { // const 参照でコピーコストを下げる return this->member; }
メンバ変数設計
- 修飾子の方針
- 読み取り専用で初期値はコンパイル時に評価可能:constexpr メンバ変数
- 読み取り専用だが初期値は不定:const メンバ変数
- 同一クラスによるインスタンスで共有する:静的メンバ変数
- 読み書きする:通常のメンバ変数
修飾子
- static 修飾子(クラス内グローバル)
- 静的メンバ変数はいわゆるクラス変数
- 静的メソッドはいわゆるクラスメソッド
- const 修飾子(読み取り専用)
- const メンバ変数
- 初期化時のみ書き込み可能
- 以降は読み取り専用変数
- const メソッド
- メンバ変数を書き換えないメソッド
- const ではないメソッドを呼ぶとエラー.
- const メンバ変数
- constexpr (コンパイル時定数)
- コンパイル時に定数として評価できることを保証
- const は読み取り専用でコンパイル時に未定でもOK(定数ではない)
- プリプロセッサは大域字句的置換. rvalue でも置換してしまう(不適切).
インターフェース
-
継承(純粋仮想関数)
// 抽象クラス class ITest { ITest(double); virtual void DoTest(void) = 0; } // 具象クラス class Test : public ITest { // 継承コンストラクタ using ITest::ITest; void DoTest(void) override { printf("Hello World!\n"); } } // 抽象クラスのコンポジション class TestRunner{ // アップキャスト TestRunner() : test_ins(new Test()) {} ITest* test_ins; }
名前空間(カプセル化)
- namespace の賢い使い方
- 無名名前空間:他ファイルから参照する必要のない処理を記載
- 複数ヘッダファイル/同一名前空間での関数定義が有効(Effective C++ §23)
- 各ヘッダファイルのインクルードで部分的に関数読み込み
- クラス外関数定義で各メンバ変数のカプセル化を高める
ユーザー定義の型(構造体・クラス・共用体)
- ユーザー定義型の変換(C++)
-
共用体:変数名とインデックス双方からアクセス
union { std::array<double, 4>; struct { double x; double y; double dxdt; double dydt; } }