29.1 知识点总结
1、定义 常对象: const Person p; 即:定义普通对象前 + const
注意: 常对象内的属性是不允许直接修改的
因此,常对象不能访问类中的普通成员函数(以免其值被直接修改) ? 只能访问常函数
****************************************************************************************
2、定义 常函数: void func() const; 即 定义普通成员函数后 + const
注意:常函数的作用: 就是为常对象服务的(因为常对象不能访问普通函数,因此有了常函数的概念)
常函数不能访问类中成员变量
原因:可以访问成员变量,就意味着可以作修改成员变量的操作,而常函数是为了常变量服务的
如果此时传入常变量,那个就意味着常变量可能会被修改,这显然是不行的
如果真的有访问成员变量的需求怎么办? 使用 mutable 修饰的成员变量
****************************************************************************************
3、关键字 mutable 的意义:
原本常对象内的属性变量都不允许直接修改,但类中成员对象有了 mutable 修饰,就允许直接修改了
原本常函数不能访问类中的成员变量,但有了 mutable 修饰,就允许访问了
29.2 常对象
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class Person
{
public:
void showPerson() {
m_A = 10;
}
int m_A;
};
说明: 当普通对象 p1 调用该函数时
m_A = 10 等价于 this-> m_A = 10
this 等价于 Person * const this = &p1 ( 只能指向p1,但可以改变p1中的值 )
即,m_A = 10 等价于 p1.m_A = 10
int main()
{
Person p1; // 普通对象
p1.m_A = 1; // 初始化
p1.showPerson(); // 由上说明可知 p1.m_A = 10 // 修改初始化值
cout << "p1.m_A = " << p1.m_A << endl; // 修改成功
//创建常对象
const Person p2;
/*
说明:常对象和普通对象的区别:
常对象在访问函数时候,this 指针 由 Person * const this 变为 const Person * const this
( 指向和指向的值都不可以直接修改,即要求常对象内的属性值是不可以直接修改的)
*/
// p2.showPerson(); // 报错
// 知识点:常对象不能访问普通成员函数
// 原因:由上例可知,普通成员函数是有能力修改对象的属性值,
如果常对象可以访问普通成员函数,其值有可能被直接修改
因此编译器强制其不能访问,以免值被直接修改
}
【常对象和常函数 常函数】29.3 常函数
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class Person
{
public:
void showPerson() const //常函数:在普通成员函数后 + const
{
// this->m_A = 100; //err:表达式左边是不可修改的左值( m_A没有 mutable 修饰)
// 说明:如果访问成员变量,就意味着可能修改,常对象调用时候,就可能直接修改变属性的值
因此常函数不能访问成员变量
cout << "常函数被调用了" << endl;
}
void showPerson1()
{
cout << "普通成员函数被调用了" << endl;
}
int m_A;
};
int main()
{
const Person p;
// p.showPerson1(); // err: 常对象只能调用常函数 // 不能调用成员函数
p.showPerson();
Person p1;
p1.showPerson(); // 注意:普通对象可以调用常函数,也可以调用普通函数
system("pause");
return EXIT_SUCCESS;
}
29.4 mutable 关键字
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class Person
{
public:
//常函数
void showPerson() const
{
// this->m_B=100; // err :常函数不能访问成员变量
this->m_A = 100; // ok // 只能访问含有 mutable 关键字的常量
}
mutable int m_A;
int m_B;
};
int main()
{
// 常对象
const Person p;
p.showPerson();
cout << p.m_A << endl; // 结果:常对象中只有 mutable 修饰的成员变量可以修改
其他成员变量都不能修改
system("pause");
return EXIT_SUCCESS;
}
文章插图
- 初中地理常考世界之最 世界地理之最
- 初学者ps抠图详细步骤,5种万能常用PS抠图方法大全
- 初学者ps抠图步骤,推荐2种常用的抠图方法
- A1在65岁再降级非常有可能的 交通部放宽65岁可以开大客吗
- 辨别方向的 100种 辨别方向的
- Z2掉落率太低耗肝力,40次未出是常态,碧蓝航线玩家选择抽卡游戏二次元
- 盐焗鸡家常做法 盐焗鸡的制作方法
- 今晚的央视春晚你们看了吗?沈腾和马丽联合艾伦和常远又带来了一个经典的搞笑小品
- 经常做梦是怎么回事 晚上经常做梦是什么原因(图文)
- 辰东完美世界动漫为什么火不起来?腾讯非常给力专门用了一栏来做完美推广