前言
常函数
成员函数后加 const 我们可以称这个函数为 常函数
常函数内不可以修改成员属性
成员属性声明时加关键字 mutable 后,在常函数中依然可以修改
常对象
常对象
声明对象前加 const 称该对象为常对象
常对象只能调用常函数
正文
常函数
class Person
{
public:
// this 指针的本质是 指针常量 , 指针的指向是不可以修改的
void showPerson() const
{
m_A = 10;
}
int m_A;
};
看看上面的代码
常函数 是不可以修改里面的值
加了 const 以后 ,这个函数里面
this 指针从 Person * const this 变成了 const Person * const this , 又因为 m_A 等价于 this->m_A , 所以 m_A 不是可以修改的左值
怎么修改呢
使用 mutable 修饰成员变量,以允许在 const 成员函数内修改它:
class Person
{
public:
void showPerson() const
{
m_A = 10; // 在 const 成员函数内部修改成员变量,因为 m_A 被声明为 mutable
}
mutable int m_A; // 使用 mutable 关键字
};
常对象
常对象对变量的调用
class Person
{
public:
// this 指针的本质是 指针常量 , 指针的指向是不可以修改的
void showPerson() const // 加const 让 this 指向的指针不可以修改
{
m_A = 10;
}
mutable int m_A;
int m_B;
};
//常对象
// 声明对象前加 const 称该对象为常对象
// 常对象只能调用常函数
void test()
{
const Person p; // 在对象前加 const ,变为常对象
p.m_A = 10; // 正确的 , 可以修改
p.m_B = 10; // 错误的
}
常对象只能调用常函数
class Person
{
public:
// this 指针的本质是 指针常量 , 指针的指向是不可以修改的
void showPerson() const // 加const 让 this 指向的指针不可以修改
{
m_A = 10;
}
void fun()
{
m_B = 10;
}
mutable int m_A;
int m_B;
};
//常对象
// 声明对象前加 const 称该对象为常对象
// 常对象只能调用常函数
void test()
{
const Person p; // 在对象前加 const ,变为常对象
p.showPerson(); // 正确的
p.fun(); // 错误的
}
如果上面中 p.fun(); 可以实现的话 ,那么就会修改 m_B 的值,这就违背了常对象不能修改一般的值的规则,所以不能调用