constメンバ関数について

constなオブジェトを扱う場合、メンバ変数を書き換られてはconstではなくなってしまいます。const性を保証するには、外部から呼び出されるメンバ関数によってメンバ変数が書き換えられないという条件を付けなければいけません。そこで登場するのがconstメンバ関数と呼ばれるものです。

メンバ関数にconstを付けると、その関数からメンバ変数を書き換えられないようにすることができます。

class Point{
private:
	double x;
	double y;
public:
	Point(double x,double y);
	//constメンバ:const Point objから呼び出すことができる
	double get_x() const {return x;}
	double get_y() const {return y;}
	//非constメンバ:constなオブジェクトから呼び出すことはできない
	void reset(){this->x=0;this->y=0;}
};

Point::Point(double x,double y){
	this->x=x;
	this->y=y;
}

上で定義されたPointクラスでは、reset()の中でメンバ変数を書き換えていますので、この関数にconstを付加するとコンパイルエラーとなってしまいます。

	void reset() const{this->x=0;this->y=0;}	//compile error:constな関数内でメンバ変数を書き換えている

さらに、constなオブジェクトから呼び出すことができるメンバ関数はconstなものに限定されます。constメンバ関数だけ利用するならば、メンバ変数を書き換えられる心配はなくなるというわけです。

#include <iostream>
using namespace std;
int main()
{
  const Point p(1,2);  //constオブジェクト
  //p.reset();   //compile error:constオブジェクトから非const関数の呼び出しは不可
  cout<<"("<<p.get_x()<<","<<p.get_y()<<")\n";
  return 0;
}

(1,2)