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

671 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

【案例一】 image-20220704141630090

【分析】

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

【解决】

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

【案例二】

image-20220704144629298

【分析】

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

    image-20220706201518761

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

    image-20220704145034917

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

【解决】

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

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

    image-20220706202107465

【总结】

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


【问题总结】

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

    image-20220706194411534

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

    image-20220706194725468

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

    image-20220706195608290

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