const成员函数/方法的用处

dan*_*ood 0 c++ const function

我想知道声明一个函数是否有任何好处const.

我知道这意味着该方法无法修改任何非静态类成员,但这样做的唯一目的是防止某人将该功能重新实现为修改非静态成员的东西,还是存在性能差异?如果存在性能差异,编译器通常可能比人类做得更好,例如inline功能吗?

只是为了澄清,我问的是以下成员函数之间的区别:

float getWidth() const
{
    return width;
}

float getWidth()
{
    return width;
}
Run Code Online (Sandbox Code Playgroud)

Arm*_*yan 7

我知道这意味着该函数无法修改任何非静态类成员

不,const并不意味着.这意味着必须允许您在常量对象上调用该函数,这是一件很重要的事情.即使您实际上没有修改非const成员函数中的任何非静态数据成员,也不允许在常量对象上调用它.

struct A
{
   void f()
   {
   }
};

void g(const A& a)
{
    a.f(); // error
}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,const意味着是类型const ClassName*而不是Classname*.其余规则是该定义的直接后果.

我不认为潜在的性能差异在这里非常重要.

  • @Kevin:我没有说没有或几乎没有性能差异(我真的不知道是否有).我只是说这并不重要,因为对正确性的偏好有更严重的理由. (2认同)
  • 比较Java`final`和C++`const`对象是没有意义的......我同意这个问题不是关于性能而是语义(什么const方法用于?).答案不是表现. (2认同)

Kev*_*vin 6

将变量声明为const允许编译器执行许多优化。它可以被视为对严格别名规则的加强。如果两个指针的类型相同,通常编译器必须假定它们可以别名。但是,如果将一个声明或用作const,编译器可能会忽略与这些操作相关的潜在别名。这可以减少不必要的加载和溢出,从而生成更简单、更快的代码。

使您的代码const正确也很重要,以便它可以与其他代码正确互操作。根据情况,丢弃const限定符可能会调用未定义的行为,因此如果函数是 non- const,则通常不可能在const对象上使用该函数。这会给任何碰巧有const对象的人带来问题。