天天看点

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的值。

继续阅读