天天看点

十四、对象的使用(二)const成员函数、const对象、mutable

一、const成员函数 const成员函数只能访问数据成员的值,不能修改对象的状态

class Test
{
private:
	int getA() const
	{
		a = 100;//错误,不能修改const对象状态
		return a;
	}
public:
	int a;
};
           

二、const对象 如果把一个对象指定为const,就是告诉编译器不要修改它,因此 const对象不能调用非const成员函数 const对象的定义: const 类名 对象名 ( 参数表 );

class Test
{
private:
	int setA(int a_)
	{
		a = a_;
	}
	int getA()
	{
		return a;
	}
public:
	int a;
};
int main()
{
	const Test a;
	a.setA(10);//错误,不能修改对象状态
	return 0;
}
           

三、mutable       在 C++ 中, mutable 也是为了突破 const 的限制而设置的。被 mutable 修饰的变量 (mutable 只能由于修饰类的非静态数据成员 ) ,将永远处于可变的状态,即使在一个 const 函数中。

      我们知道,假如类的成员函数不会改变对象的状态,那么这个成员函数一般会声明为const。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

例子如下:

class Test
{
public:
	Test():count(0){}
	void setA(int a_)
	{
		a = a_;
	}
	int getA()
	{
		return a;
	}
	void display() const
	{
		cout<<a<<endl;
		count++;
		cout<<"count:"<<count<<endl;
	}
private:
	mutable int count;
	int a;
};
int main()
{
	Test a;
	a.setA(12);
	a.display();
	a.display();
	return 0;
}
           

这个例子中,我们打印变量的display函数本身不修改对象状态,所以用const修饰。但是如果我们需要统计打印次数这个和对象状态无关的变量的话,我们就需要用mutable修饰count变量。

继续阅读