赣州服装网站建设百度搜索引擎首页
常函数:
- 成员函数后加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 thisvoid 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 thisvoid ShowPerson() const{this = NULL;this->m_B = 100; }public:int m_A;mutable int m_B; // 加mutable关键字,即使在常函数中,也可以修改这个值。
};
四、常对象
加mutable关键字,即使在常对象中,也可以修改这个值。
class Person {
public://const Person * const thisvoid 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 thisvoid 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(); // 常对象 不可以调用普通成员函数,因为普通成员函数可以修改属性。
}