原文(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类型的,所以会出现下面的错误。
总结一下: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会提示如下错误
也就是说: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();
}
可以看到const类型的sum函数已经修改了mutable 修饰的 b的值。