【C++类和对象】const修饰对象坑点总结

【案例一】

image-20220706203511308

【分析】

  • 按照传值方式返回会产生一个临时变量,返回值是对这个临时变量的拷贝
  • 由于临时变量具有常属性,所以在赋值给d3的时候就存在引用权限放大的问题

【解决】

  • 返回值使用引用就不会出现拷贝的问题
  • 对于无需修改成员变量的成员函数,要尽可能的加上const修饰

【案例二】

image-20220706203526452

【分析】

  • 在传参时,会隐含的传入一个指向对象本身的this 指针, 指向的对象可以修改,但是指针本身不能修改

    image-20220706203559589

  • 在调用 Print 函数传参的时候传入的 this 指针类型如下图

    image-20220706203621301

  • Print 函数中的this指针形参为Date* 类型,所以当传入 const Date* 类型的 this指针时,就会存在读写全向放大的问题

【解决】

  • ① 方法一:去掉形参的const

  • ② 方法二:为成员函数加上const。编译器对const成员函数处理机理见下图:

    image-20220706203642546

【总结】

​ 建议成员函数中不需要修改成员变量的函数都给 this 指针加上const修饰,这样普通对象和const对象都可以调用该成员函数。同时,当成员变量声明和定义分离的时候,注意定义与声明都要都要加上const。


【问题总结】

  • ① const 对象不可以调用非 const 成员函数。因为在成员函数中会将 const 对象当做非const对象使用,就会存在权限放大问题

    image-20220706203716505

  • ② 非 const 对象可以调用 const 成员函数。因为在成员函数中会将非 const 对象当做 const 对象来使用,读写权限缩小,这是符合使用规范的

    image-20220706203748218

  • ③ const成员函数内不可以调用其它的非const成员函数。将const对象当做非const使用,就会造成权限放大问题。

    image-20220706203735159

  • ④ 非const成员函数内可以调用其它的const成员函数。读写权限缩小,符合使用规范

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罅隙`

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值