【案例一】
【分析】
- 按照传值方式返回会产生一个临时变量,返回值是对这个临时变量的拷贝
- 由于临时变量具有常属性,所以在赋值给d3的时候就存在引用权限放大的问题
【解决】
- 返回值使用引用就不会出现拷贝的问题
- 对于无需修改成员变量的成员函数,要尽可能的加上const修饰
【案例二】
【分析】
在传参时,会隐含的传入一个指向对象本身的this 指针, 指向的对象可以修改,但是指针本身不能修改
在调用 Print 函数传参的时候传入的 this 指针类型如下图
Print 函数中的this指针形参为Date* 类型,所以当传入 const Date* 类型的 this指针时,就会存在读写全向放大的问题
【解决】
① 方法一:去掉形参的const
② 方法二:为成员函数加上const。编译器对const成员函数处理机理见下图:
【总结】
建议成员函数中不需要修改成员变量的函数都给 this 指针加上const修饰,这样普通对象和const对象都可以调用该成员函数。同时,当成员变量声明和定义分离的时候,注意定义与声明都要都要加上const。
【问题总结】
① const 对象不可以调用非 const 成员函数。因为在成员函数中会将 const 对象当做非const对象使用,就会存在权限放大问题
② 非 const 对象可以调用 const 成员函数。因为在成员函数中会将非 const 对象当做 const 对象来使用,读写权限缩小,这是符合使用规范的
③ const成员函数内不可以调用其它的非const成员函数。将const对象当做非const使用,就会造成权限放大问题。
④ 非const成员函数内可以调用其它的const成员函数。读写权限缩小,符合使用规范
【C++类和对象】const修饰对象坑点总结
最新推荐文章于 2024-01-22 20:22:01 发布