天天看點

C++的const類成員函數

原文(C++的const類成員函數)

下面對幾個要點做一些補充:

1、C++中const類型的對象隻能調用const類型的成員函數。

在下面的代碼中,我們在類中聲明一個const類型的成員函數,再執行個體化一個普通類型的MyClass對象A和const類型的MyClass對象B。

class MyClass
{
public:
	MyClass();
	~MyClass();
public:
	void sum()const;
	void add();
private:
	int a;
	mutable int b;
};
int main()
{
	MyClass A;
	MyClass const B;
	A.add();
	A.sum();
	B.add();//IDE會提示錯誤
	B.sum();
}
           

VS會在B.add();這一句提示錯誤。因為我們的add函數是非const類型的,而B是const類型的,是以會出現下面的錯誤。

C++的const類成員函數

總結一下:const類型的對象隻能調用const類型的成員函數。非const類型的對象則沒有這個限制,兩種類型的成員函數都可以調用。

2、const類型的成員函數無法修改類的成員。

在MyClass類中,我們定義了一個const類型的成員函數sum。

class MyClass
{
public:
	MyClass();
	~MyClass();
public:
	void sum()const;
	void add();
private:
	int a;
	mutable int b;
};

void MyClass::sum() const
{
	a++;//此處VS會提示錯誤
}


           

然後在sum将函數中寫a++,vs會提示如下錯誤

C++的const類成員函數

也就是說:const類型的成員函數無法修改類的成員。(此處準确來說應該是無法修改類的非mutable 類型成員,關于mutable的解釋請看第3條)

3、對可變資料成員的了解(mutable關鍵字)

在第二條中說const類型的成員函數無法修改類的成員,這句話其實是不嚴謹的 ,準确應該是無法修改類的非mutable類型的成員。參照C++primer(5th) P245,如果在類的成員前面加上mutable修飾,那麼此時一個const類型的成員函數也可以修改這個成員的值。

class MyClass
{
public:
	MyClass();
	~MyClass();
public:
	void sum()const;
	void add();
private:
	int a;
	mutable int b;
};


MyClass::MyClass()
{
	a = 10;
	b = 20;
}


void MyClass::add()
{
	a++;
	b++;
	std::cout << "a:" << a << std::endl;
	std::cout << "b:" << b << std::endl;
}


void MyClass::sum() const
{
	b++;
	std::cout << b;
}
int main()
{
	MyClass A;
	A.sum();
	A.add();
	
}


           
C++的const類成員函數

可以看到const類型的sum函數已經修改了mutable 修飾的 b的值。

繼續閱讀