const出现在星号左边,表示被指物是常量;出现在星号右边,表示指针自身是常量。
const显式地表明哪些部分是不应修改的,增强了代码的可读性,同时也让编译器在检测到非法的修改操作时及时报错。
const某些情况下可以避免将“==”写成“=”的错误
另外,const成员函数可以操作const对象(const对象只能调用const成员函数而不能调用非const成员函数,非const对象可以调用const成员函数和非const成员函数)
两个成员函数如果只是常量性不同,可以被重载,如下:
①void func()const{}以及 void func(){}是不一样的,前者不允许修改成员数据,对操作符重载也是同理
如果是引用传递的函数参数常量性不同,那么可以被重载,如下:
②void func(constint &a){} 以及 void func(int &a){}也是不一样的
而如果是值传递的函数参数常量性不同,则不可被重载(个人理解是const用于保护这个参数不被修改,但由于值传递的方式函数并不会修改传入参数,所以没有必要加const)
③void func(constint a){} 以及 void func(int a){}
//在一个类中尝试定义这两个成员函数,报错信息为重复定义
mutable可以解除const的限制,使得带有mutable的成员变量即使在const成员函数中也可以被修改,如下:
class A{
public:
int func() const; //const成员函数
private:
mutable int a;
int b;
};
int func() const
{
a = 5; //可以修改
b = 5; //不可以修改
}
当const和非const成员函数有着实质等价的实现时,可以令非const成员函数调用const成员函数,避免代码重复。