【问题标题】:const parameter in function prototype [duplicate]函数原型中的 const 参数
【发布时间】:2014-02-13 17:32:12
【问题描述】:

我正在尝试理解一段 C++ 代码,但我已经到了不明白以下含义的地步:

以下定义在函数原型文件中,即 (.h)

让我困惑的是 const 参数:

ofMesh getImageMesh() const;

我的意思是,函数/方法返回一个类 ofMesh,getImageMes​​h() 没有参数并且 然后 const 跟随。为什么这样使用“const”?

【问题讨论】:

标签: c++ constants


【解决方案1】:

这是一个const 方法,这意味着您可以在const 对象上调用它,它不会修改非mutable 成员,也不会调用其他非const 方法。

struct X
{
    void foo();
    int x;
    void goo() const;
};

void X::goo() const
{
   x = 3;  //illegal
   foo();  //illegal
}

//...
const X x;
x.foo();   //illegal
x.goo();   //OKAY

【讨论】:

  • 这也允许编译做某些优化。
  • const 所带来的程序稳定性收益不容小觑。
  • @mindo:不,它没有。 const 和优化是分开的事情。不要忘记有 mutable 和 const_cast 关键字,所以仅仅因为某些东西被标记为 const 并不意味着它永远不会改变!
  • 也可以对非const对象调用const方法,将对象转换为const对象。你不能在 const 对象上调用非常量方法。
【解决方案2】:

基本上,这意味着该方法不会修改该类实例的状态。这意味着它也不会调用会改变类实例状态的其他成员。

好的:

class Foo
{
   int m_foo;
   int GetFoo() const
   {
       return m_foo;
   }
}

编译错误:

class Foo
{
   int m_foo;
   int GetFoo() const
   {
       m_foo += 1;
       return m_foo;
   }
}

还有更深层次的考虑,例如通过引用传递时的性能优势 - 如果您想更深入,要搜索的术语是“常量正确性”。

【讨论】:

    【解决方案3】:

    这一行中的const 表示它是一个常量函数。这意味着它不能修改其中的对象。

    因此,如果你声明一个成员函数const,你告诉编译器这个函数可以被一个const对象调用。未明确声明 const 的成员函数被视为将修改对象中的数据成员的成员函数,编译器将不允许您为 const 对象调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多