• 代码技巧: 类中同一个函数可以同时存在常函数版本和普通函数版本(c++)


    在类中如果我们希望在常函数中修改某属性的值可以使用mutable来实现。

    如果有下面的场景,假设我们有一个函数hobby()需要在非const的对象调用的时候,应该去修改内部的属性,在const修饰的对象调用的时候可以满足不修改内部的属性。

    鉴于上面的情况,我们即使使用mutable也无法满足,因为mutable是让const函数修改属性,一旦设置const的对象和非const的对象就都可以修改了,并不能像上面那样进行区分。

    解决方式:   我们可以对于一个函数写两个版本,一个是被const修饰的,一个是不被const修饰的。这两个函数的函数名一样,参数一样,内部实现可以相同也可以不同。

     当const的对象去调用此函数的时候,会调用到const修饰的版本,这样就不会修改属性。
     当非const的对象去调用函数的时候,会调用到非const修饰的版本,这样就可以修改属性。

     

    当然,我们同一个函数实现两个版本,可能会重复写两段相同的代码,只是const和非const的区别,所以如果不是特殊需求,还是写一个就行。(根据情况确定是否设定为const) 


    例子:

    1. #include <iostream>
    2. #include <string>
    3. class People {
    4. private:
    5. std::string m_hobby;
    6. public:
    7. People(const std::string& other)
    8. : m_hobby(other) {
    9. }
    10. std::string hobby() {
    11. m_hobby = "看电视";
    12. return m_hobby;
    13. }
    14. std::string hobby() const{
    15. return m_hobby;
    16. }
    17. };
    18. int main() {
    19. People p("学习");
    20. p.hobby();
    21. const People p1("学习");
    22. p1.hobby();
    23. std::cin.get();
    24. return 0;
    25. }

    p1为常对象,调用的是hobby的常函数版本,
    p为普通对象,调用的是hobby的普通函数版本。 

  • 相关阅读:
    centos7 探测某个tcp端口是否在监听
    python的语法错误与异常
    java进阶专栏的学习指南
    开发抖音小游戏什么技术
    程序员保密协议(双向)
    【软件与系统安全笔记】五、内存破坏防御
    GO语言 | go work 神一般的管理 多个module没烦恼
    [解决方案]springboot怎么接受encode后的参数(参数通过&=拼接)
    ChatGPT-4o体验demo
    货币识别易语言代码
  • 原文地址:https://blog.csdn.net/weixin_68026222/article/details/138873160