常函数:
- 成员函数后加const后我们称为这个函数为常函数
- 常函数内不可以修改成员属性
- 成员属性声明时加关键字mutable后,在常函数中依然可以修改
常对象:
- 声明对象前加const称该对象为常对象
- 常对象只能调用常函数
一、this指针本质
this指针的本质是一个指针常量,Person * const this。const修饰的是 “this”, 指针的值不可以改,即指针的指向不可以改,但指针指向的对象的值可以改。
成员函数ShowPerson的定义是:
void ShowPerson() {
//this = NULL; // 指针的指向不可以改,this = NULL非法。
this->m_B = 100; // 指针指向的对象的值可以改,合法。
}
c++把它处理为:
//this指针的本质是一个指针常量,指针的指向不可修改
//Person * const this = &p
void Person :: ShowPerson(Person * this) {
//this = NULL; // 指针的指向不可以改,this = NULL非法。
this->m_B = 100; // 指针指向的对象的值可以改,合法。
}
实际的调用方式为:
Person p;
p.ShowPerson(&p);
二、常函数
在 ShowPerson()
函数后面添加 const 关键字,const Person * const this ,是指向常量的常量指针。指针的指向不可以改,指针指向的值也不可以改。
常成员函数可以访问常对象中的数据成员,但仍不允许修改常对象中数据成员的值。
class Person {
public:
//如果想让指针指向的值也不可以修改,需要声明常函数
//const Person * const this
void ShowPerson() const{
this = NULL; // 指针的指向不可以改
this->m_B = 100; // 指针的指向对象的值也不可以改
}
public:
int m_A;
int m_B; //可修改 可变的
};
void test01() {
Person p;
p.ShowPerson();
}
三、mutable关键字
加mutable关键字,即使在常函数中,也可以修改这个值。
class Person {
public:
//const Person * const this
void ShowPerson() const{
this = NULL;
this->m_B = 100;
}
public:
int m_A;
mutable int m_B; // 加mutable关键字,即使在常函数中,也可以修改这个值。
};
四、常对象
加mutable关键字,即使在常对象中,也可以修改这个值。
class Person {
public:
//const Person * const this
void ShowPerson() const{
this = NULL;
this->m_B = 100;
}
public:
int m_A;
mutable int m_B; // 加mutable关键字,即使在常函数中,也可以修改这个值。
};
//const修饰对象 常对象
void test02() {
const Person p; // 常量对象
p.m_B = 100; // 加mutable关键字,即使在常对象中,也可以修改这个值。
p.m_A = 100;
}
五、常对象只能调用常函数
常对象 不可以调用普通成员函数,因为普通成员函数可以修改属性。
class Person {
public:
//const Person * const this
void ShowPerson() const{
this = NULL;
this->m_B = 100;
}
void func() {
m_A = 100; // 如果常对象能调用这个普通函数,那么就可以间接地修改常对象的属性,矛盾。
}
public:
int m_A;
mutable int m_B; // 加mutable关键字,即使在常函数中,也可以修改这个值。
};
// const修饰对象,表示一个只读状态 常对象本身不可以修改属性
void test03() {
const Person p; // 常对象
p.ShowPerson(); // 常对象只能调用常成员函数。
p.func(); // 常对象 不可以调用普通成员函数,因为普通成员函数可以修改属性。
}