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メンバ関数から書き換え可能になります。