• 如何减少const的传染性?


    准则1,如果你不想修改一个变量的值或者想让这个变量内联,那么就将这个变量声明为const

    const int max = 1000;
    const char* name = "parmanent name";
    
    • 1
    • 2

    这些变量可以是全局变量,同样也可以是局部变量,将它们声明为一个全局变量可以促进它们的内联机会,并可以防止没有必要的修改。

    下面一条准则是关于函数的

    准则2,作为一个函数,对接收的值要self-disciplined, 对返回的值要relaxed.

    这意味着,如果你能完全确定在一个函数中没有任何机会可以修改参数的值,那么就在它上面加上const, 但是不要在返回值上加const,除非编译器要求你这样做。

    这背后的原因需要一点点的思考,在参数上加上const,是告诉别人,你只管传递给我参数,但是我保证不会去改变它的值,(或者说该函数对传来的参数没有任何副作用,我对这个参数很感兴趣)。

    这其实是一件好事情,因为函数的调用者不希望它们传进来的参数,被意外的修改,他们需要完整的原始值,因为他们将在您返回后使用它们。

    void foo(const char* in);
    
    • 1

    是否要将const放在参数上,取决于函数不会修改该参数,

    但是下面这种情况就会出事情

    void foo(const char* in) {
    	bar(in);
    }
    bar(char* in) {...}
    
    • 1
    • 2
    • 3
    • 4

    首先你无法确定bar函数会不会修改in这个参数,如果会修改参数,你就不可以在foo的参数上放上const

    这就是C++让人抓狂的地方,因为其它的函数可能是别人编写的,人家可能不会遵循你的规则,因为这样写是无聊的。

    另一个方面,为什么你不应该将const放在返回类型上,因为这中做法是无意义的,这就像现实中别人在死后在遗嘱上写到“我的儿子可以继承我的房子,但是却不可以修改它”。但是这种限制真的可以实现吗?显然是不可以的。

    回到编程的上下文中,不允许调用者修改你给它们的东西有什么意义?你应该将这件事情交给调用者来做,即使你做了,当const妨碍它们的时候,它们就会使用const_cast,这就使得返回const类型的值毫无用处。

    所以记住不要在返回值类型上加上const。

    如果你加上了可能会形成一条污染链

    const char* bar();
    
    • 1
    void baz() {
    	const char* ret = bar();
    	bizarr(ret);
    }
    
    • 1
    • 2
    • 3
    • 4
    void bizarr(const char* in) {
    	bizarr2(in);
    }
    
    • 1
    • 2
    • 3
    void bizarr2(const char* in);
    
    • 1

    所以还是不要在返回值类型上加上一个const

    那么将在什么时候在返回值类型上加上const呢?


    原文地址

  • 相关阅读:
    Python-使用openpyxl读取excel内容
    动手学习深度学习之环境配置
    使用vue3+element-ui plus 快速构建后台管理模板
    java-php-python-基于Ssm学生信息管理系统计算机毕业设计
    SLAM经验分享:少年不惧岁月长
    Cryptocell-712安全引擎概述
    C++ 连接MySQL数据库并读取数据
    有关动态规划
    【运维、实施必读】ansible使用playbook批量部署nginx等服务及常见错误排查
    【LeetCode】63. 不同路径 II
  • 原文地址:https://blog.csdn.net/user_2022_5_1/article/details/127405556