1.常函数
- 成员函数后加const变成常函数。( void func() const {…} )
- 常函数内不能修改类的数据成员属性。
- 成员属性声明的时候加关键字mutable后,在常函数中就可以修改,相当于获得了一个比较高的权限。
常对象
- 声明对象的时候在前面加上const即可变成常对象。
- 常对象只能访问常函数,普通函数不能被访问。
这里就又涉及到了this指针,我们这里的this指针实际上是一个常量,this指针的指向是不可以随意修改的。 this指向那个定义的对象,这时候要让他指向别的东西就不行。
当时我this指向的值可以发生改变,但是如果我现在把函数定义成const常函数之后,this指向的值也就不能随意更改了,除非我加上mutable关键字。
2.代码分析:
示例代码1:
class people {
public:
int m_age=1000;
void fun() {
this->m_age = 100;//这里不会报错,因为this指针是指针常量,指向确实不能变,当时指向的内容可以变,就像 people const *this一样。
}
};
示例代码2:
class people {
public:
int m_age1=1000;
mutable int m_age=1000;
void fun() const {
this->m_age1 = 100;//这里会报错,常函数内不能修改类的数据成员属性。
this->m_age2=100;//,这里不会报错成员属性声明的时候加关键字mutable后,在常函数中就可以修改,相当于获得了一个比较高的权限。
}
};
int main() {
people p;
}
报错示意图:
示例代码3:
//声明一个常对象
class people {
public:
mutable int m_age=1000;
void fun() const {
this->m_age = 100;
}
void func() {}
};
int main() {
const people p;//声明一个常对象,只需在前面加上const即可
p.fun();//常对象只能访问常函数,这里的fun是常函数
p.func();//常对象不能访问普通函数,这里的func为普通函数
}