类和对象--常函数和常对象
1 常函数
1.1 this指针的本质
假设有一个Person类。
那么这个this指针的本质就是:
Person * const this;
// 此时,指针的指向不可以修改,而指针指向的值是可以修改的。
1.2 常函数的原理
添加关键字,修饰成员函数中this指针,让this指针指向的值也不可以修改。(即不可以修改类中的成员变量的值)
1.3 常函数的语法
返回类型 成员函数名() const {}
// const目的是为了修饰成员函数中的this指针,让指针指向的值不可以修改
2 常对象
2.1 常对象的语法
// 类名前加const关键字修饰
const 类名 类对象;
2.2 使用常对象的注意事项
- 常对象必须初始化。即,如果类中存在成员变量并且使用默认构造函数对其初始化,必须手动添加默认构造函数,如果使用拷贝构造函数则不需要必须手动添加。
- 常对象只能调用常函数
3 mutable 关键字 – 在常函数或者常对象中可以修改成员变量
有些成员变量比较特殊,依然在常函数或者常对象中可以修改,需要加入关键字 mutable
#include <iostream>
using namespace std;
class Person
{
public:
Person(){} // 常函数必须初始化,即,如果使用默认构造函数对其初始化,必须手动添加默认构造函数
// 常函数
void setAge() const
{
//m_Height = 170; // 没有添加mutable关键字的成员变量在常函数中不可以修改
m_Age = 18;
cout << m_Age << endl;
}
void showAge()
{
}
mutable int m_Age; // 添加关键字mutable,使其在常函数和常对象中可以修改
double m_Height;
};
int main()
{
Person p;
p.setAge();
const Person p1; // 常对象
p1.m_Age = 20; // 添加关键字mutable,使其在常函数和常对象中可以修改
p1.setAge();
//p1.showAge(); // 常对象只能调用常函数
return 0;
}
4 const和static
对于成员函数 ,不可以用static 和 const同时修饰 。