在类中如果我们希望在常函数中修改某属性的值可以使用mutable来实现。
如果有下面的场景,假设我们有一个函数hobby()需要在非const的对象调用的时候,应该去修改内部的属性,在const修饰的对象调用的时候可以满足不修改内部的属性。
鉴于上面的情况,我们即使使用mutable也无法满足,因为mutable是让const函数修改属性,一旦设置const的对象和非const的对象就都可以修改了,并不能像上面那样进行区分。
解决方式: 我们可以对于一个函数写两个版本,一个是被const修饰的,一个是不被const修饰的。这两个函数的函数名一样,参数一样,内部实现可以相同也可以不同。
当const的对象去调用此函数的时候,会调用到const修饰的版本,这样就不会修改属性。
当非const的对象去调用函数的时候,会调用到非const修饰的版本,这样就可以修改属性。
当然,我们同一个函数实现两个版本,可能会重复写两段相同的代码,只是const和非const的区别,所以如果不是特殊需求,还是写一个就行。(根据情况确定是否设定为const)
例子:
#include <iostream>
#include <string>
class People {
private:
std::string m_hobby;
public:
People(const std::string& other)
: m_hobby(other) {
}
std::string hobby() {
m_hobby = "看电视";
return m_hobby;
}
std::string hobby() const{
return m_hobby;
}
};
int main() {
People p("学习");
p.hobby();
const People p1("学习");
p1.hobby();
std::cin.get();
return 0;
}
p1为常对象,调用的是hobby的常函数版本,
p为普通对象,调用的是hobby的普通函数版本。