天天看點

十四、對象的使用(二)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變量。

繼續閱讀