【问题标题】:What is the purpose of const here? [duplicate]这里 const 的目的是什么? [复制]
【发布时间】:2020-11-23 04:52:24
【问题描述】:

我看过以下内容:

void function_name(std::string& txt) const;

上述原型中的 const 的目的是什么?函数的返回类型是 void 所以没有返回类型,对我来说它看起来完全没有意义,我见过很多这样的,在传递参数时也是如此:

void function_name(const int a);

为什么 const 会在上面添加任何东西,如果它不是指针或引用,无论如何都不能在函数中更改?

【问题讨论】:

  • 第二个,防止有人维护代码,不小心写了一行a=/*a magical number*/而破坏了函数。
  • 请在每个帖子中提出 1 个问题。你的两个问题有两个完全不同的答案。

标签: c++ constants


【解决方案1】:
void function_name(std::string& txt) const;

const 主要意味着这是一个const 成员函数,它不应该改变对象的状态。所以如果函数改变任何成员变量都会导致编译错误。

对于第二种情况:

void function_name(const int a);

这个 const 意味着该函数不应该在其函数体中更改变量a。但是请注意,const 对于intbool 等基本类型不是必需的。此外,它最有可能在按引用传递时应用(而不是像这样按值传递)。

所以一个典型的用法应该是这样的:

void function_name(const some_non_trival_type& a);

【讨论】:

    【解决方案2】:

    也就是说一开始没有const也可以。

    void function_name(const int a)
    {
        int b = 10;
        // complex things ...
        std::cout<< a+b;
    }
    

    有一天,有人认为新行会神奇地提高函数的性能

    void function_name(const int a)
    {
        a = 10; // Beep! It doesn't compile.
        int b = 10;
        // complex things ...
        std::cout<< a+b;
    }
    

    然后这个const 在任何单元测试执行之前拯救世界。

    我会说这个 const 可能有一个语义意思告诉别人“不要修改它,因为这个函数根据参数的 constness 正常工作”。

    【讨论】:

      【解决方案3】:

      const 方法原型使您也可以将此类方法用于 const 对象,例如:

      struct X
      {
          void function_name(std::string& txt) const {}
      };
      
      int main()
      {
          const X x;
          std::string s{"Hallo"};
          x.function_name(s); // will not work if the function is not marked as const!
      }
      

      第二种情况

      void function_name(const int a);
      

      给编译器一个提示,你将(并且可以)永远不会更改 const 变量的内容。这允许编译器对其进行优化。如果您使用非平凡的对象,例如:

       void function_name(const XYZ x);
      

      这更有意义,因为如果它不是 const,编译器必须为该函数创建对象的完整副本。这也可能被优化,但在 const 的情况下,根本不需要复制,因为什么都不会改变。通过标准的聪明编译器,内部生成的代码可以等同于:

       void function_name(const XYZ& x);
      

       void function_name(XYZ& x);
      

      对于给定的使用 int 的示例,它或多或少没有任何作用,但澄清了接口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        相关资源
        最近更新 更多