C++const修饰成员函数
-
常函数
成员函数后加const后我们称为这个函数为常函数const修饰成员函数涉及到this指针的概念。
1.1.this指针
假如定义了一个person类,在调用类中变量时,
m_B = 100;
就会用到this指针,
this->m_B = 100;
this指针的本质是
person * const this
即this为指针常量,那么this的指向就不可以改变!
this = NULL;//这句话就是错的
class Person {
public:
Person() {
m_A = 0;
m_B = 0;
}
void ShowPerson() {
//系统自动将下面一行变成this->m_B = 100;
m_B = 100;//调用类中变量
}
public:
int m_B;
};
1.2.常函数带来的改变
函数后加上const,带来的改变是this指针又多了一个const修饰,
即: const person * const this
第一个const给this带来的改变是指向的数值不能修改,即:常量指针
第二个const给this带来的改变是指向不能修改,即:指针常量
所以,this的指向和指向的数值都不能修改!
void ShowPerson() const {
this = NULL;//报错
m_B = 100;//报错
}
1.3.mutable修饰的数据成员
mutable:可改变的
mutable修饰的数据成员可以在常函数中改变数值。
class Person {
public:
Person() {
m_A = 0;
m_B = 0;
}
void ShowPerson() const {
//系统自动将下面一行变成this->m_B = 100;
m_B = 100;//报错
m_A = 100;//不报错
}
public:
mutable int m_A;//可改变
int m_B;
};
- 常对象
声明对象前加const称该对象为常对象
需要注意的几点:
2.1常对象可以修改mutable修饰的数据成员
因为普通成员函数可以修改数据成员的值,此时如果常对象调用普通成员函数,那么就有可能修改数据成员函数的值,而这是与定义相违背的!
void MyFunc() {
//mA = 10000;//修改数据成员的值
}
void test01() {
const Person person; //常量对象
cout << person.m_B << endl;
//person.m_B = 100; //常对象不能修改成员变量的值,但是可以访问
person.m_A = 100; //但是常对象可以修改mutable修饰成员变量
//常对象访问成员函数
person.MyFunc(); //常对象不能调用普通成员函数
}
2.2常对象只能调用常函数
这很好理解,常函数保证了数据成员不会随意改动,满足常对象的定义。