当前位置: 首页 > article >正文

类的相关知识(二)const

const修饰对象

class Role
{
public:
    int hp;
    void addhp(Role& r)
    {
        hp+=100;
    }
    int& gethp() const
    {
        return hp;
    }
}
int main()
{
    const Role hero;
    hero.hp=199;
    Role NPC;
    NPC.gethp()=200;
    const Role* ptr=&NPC;
    ptr->hp=100;
    sethp(Role& r)
}

const修饰的对象不能更改它成员变量的值,这里hero的hp不能被修改,const修饰的指针指向的内存也不能修改,即ptr指向的hp也不能修改,因为ptr的类型是常量,编译器会把它看作是指向常量的指针,所以不会让它指向的值修改,同样因为这个原因,ptr不能访问addhp,为什么这里没写完呢?因为ptr根本就不能访问,更别提修改它的值了,那怎么修改呢?要给addhp函数添加const修饰即可

void addhp(Role& r) const
    {
        hp+=100;
    }

为什么不能放到前面呢?因为放在前面,就相当于声明了返回值类型为const,const修饰的成员函数,函数内部不能修改成员属性的值

因为const的原则,即const对象不能以任何方式改变,就产生了一系列效应,比如const对象只能调用const成员函数,另一个变化是在const成员函数内,this指针也变成了const指针

const修饰返回值

像上面,当NPC调用sethp时,也不能通过编译,因为返回的是一个引用,引用意味着有修改hp的可能性,所以不能这样调用,除非在函数头前面加上const,或者去掉引用,加const就告诉了编译器返回值虽然是个引用,但是也不能修改

const int& gethp() const
{
    return hp;
}

因为const对象只能调用const成员函数,有时候const对象如果想要调用其他成员函数,怎么办呢?有两个办法,1是利用函数重载,重新声明一个函数相同,参数名不同的函数,一个加const,一个不加const,2是在每个不修改成员函数的函数后面都加上const。

const类型转换、

void func(Role* r)
{

}
const Role r;
func( &r );
func( (Role *) &r);
func(const_cast<Role*> &r)

这里,实参和形参类型不符合,就要用到类型转换

mutable

上面我们说过,const修饰的成员函数,函数内部不能修改成员属性的值,但是,当属性被mutable关键字修饰的时候,属性就能够在函数内被修改。

语法 mutable int hp;


http://www.kler.cn/a/8245.html

相关文章:

  • 【go从零单排】JSON序列化和反序列化
  • 容器技术在DevOps中的应用
  • kafka面试题解答(四)
  • linux c/c++最高效的计时方法
  • WPF学习之路,控件的只读、是否可以、是否可见属性控制
  • 2024版本IDEA创建Sprintboot项目下载依赖缓慢
  • 光度立体法检测原理讲解
  • 驾校预约课程管理系统设计与实现
  • 对象序列化流
  • 前端实现html转pdf
  • html+css实现的登录界面
  • 【计算机视觉·OpenCV】使用Haar+Cascade实现人脸检测
  • ESP32设备驱动-MLX90615红外测温仪驱动
  • Files的常用方法都有哪些?
  • 快速尝鲜Oracle 23c免费开发者版,惊喜多多
  • 分布式一致性协议
  • ctfshow web入门 爆破 21-28
  • P1011 [NOIP1998 提高组] 车站
  • Java设计模式 07-装饰者模式
  • 【Spring】2—IOC容器
  • 教你如何搭建物业-后勤管理系统,demo可分享
  • 静态路由的原理和配置(理论详细实验全面)
  • 周记录总结
  • 微积分——Rolle定理的理解(罗尔定理)
  • [Win32] 窗体暗色模式, C++, WinForm, WPF 使用方法, 判断颜色模式, 响应颜色变更消息, 设置标题栏暗色.
  • 初学对象存储OSS---学习笔记