21項 使えるときは、必ずconstを使おう
"使えるときは、必ずconstを使おう"
ポインタにconstをつけるとき、constの場所によって意味が変わります。
アスタリスク*の左側にconstがあればポインタの指す対象がconstとなり、右側ならポインタがconstになります。
char *p1 = "hello"; // p1はcharへのポインタ const char *p2 = "hello"; // p2はconst charへのポインタ char * const p3 = "hello"; // p3はcharへのconstなポインタ const char * const p4 = "hello"; // p4はconst charへのconstなポインタ p1 = NULL; //OK *p1 = 'a'; //OK p2 = NULL; //OK *p2 = 'a'; //NG p3 = NULL; //NG *p3 = 'a'; //OK p4 = NULL; //NG *p4 = 'a'; //NG char const * p5 = "hello"; // p5はconst charへのポインタ p5 = NULL; //OK *p5 = 'a'; //NG
constオブジェクトからは、constなメンバ関数しか呼び出せません。
constなメンバ関数とconstでない同名のメンバ関数が存在するとき、constでないオブジェクトからその関数を呼び出すと、constでないメンバ関数が優先的に呼び出されます。
class C { public: ConstTest(int num): _value(num){} int getValue() { return _value; } int getValue() const { return _value; } private: int _value; }; ... C c1; const C c2; c1.getValue(); //int getValue()が呼び出される c2.getValue(); //int getValue() const が呼び出される
mutableという記憶クラス指定子があります。
mutable指定されたメンバ変数は、constメンバ関数から書き換え可能になります。