不允许dllimport函数的定义_C++知识点 29:常对象和常函数

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;
}

043d1d19f51def3f427f203d4c566844.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值