問題の歴史:
C++におけるconst修飾子は、安全性の観点から、内部状態を変更しないことが保証された関数を示すために登場しました。クラスの文脈では、constメソッドは厳密なカプセル化と偶発的なエラーからの保護が必要なプロジェクトにおいて必須です。
問題:
getterや補助関数、検証メソッドがconstとしてマークされるのを忘れると、constオブジェクトに対して呼び出すことができません。constメソッドがないと、コンパイラはデータの不適切な変更を防ぐことができません。
解決策:
メソッドの宣言において、シグネチャの後にconstを追加します(前ではありません!) これにより、通常のオブジェクトおよびconstとして宣言されたオブジェクトの両方にメソッドを呼び出すことができ、状態変更のエラーを回避できます。こうしたメソッドの内部では、クラスのメンバーを変更することはできず(mutableを除く)、読み取り専用です。
コード例:
class Counter { int value; public: int getValue() const { return value; } // const Counterに対して呼び出せます }; void print(const Counter& c) { std::cout << c.getValue(); }
主な特徴:
メソッドのconstは、戻り値の前に書くのか後に書くのか?
括弧の後にのみ:int getValue() const; — 戻り値の型の前に書くのは誤りです(例:const int get();)。
constメソッドはnon-constメソッドを呼び出せますか?
いいえ、constメソッドはconstオブジェクトの場合、他のconstメソッドのみを呼び出すことができます。
メソッド内のconstと戻り値のconstは何が違いますか?
int get() const(メソッドは状態を変更しない)
const int get();(戻り値は変更できないが、メソッドは内部データを変更できる)
クラス内部のメソッドでconstが欠けていて、そのメソッドが状態を変更しない場合、constオブジェクトに対して呼び出すことができず、分析ツールやAPIとの作業にクラスを活用できません。
利点:
欠点:
全てのgetter、検証、補助メソッドがconstとして宣言されていて、テストはconstオブジェクトと非constオブジェクトの両方をカバーしています。
利点:
欠点: