函数头后面的`const`是什么意思?

时间:2012-03-20 16:32:02

标签: c++ syntax const

有一个class A,它有以下operator()实现:

void A::operator()(...parameters...) const 
{
    // operator body
}

const是什么意思?

6 个答案:

答案 0 :(得分:6)

C ++中的方法可以像上面的例子一样标记为const,表示该函数不会修改实例。为了强制执行此操作,this指针在方法中的类型为const A* const

通常,方法中的this指针为A* const,表示我们无法更改this指向的内容。也就是说,我们无法做this = new A()

但是当类型为const A* const时,我们也无法更改任何属性。

答案 1 :(得分:2)

该方法使用this作为const A*,然后只能调用其他const方法。

请参阅CPP常见问题解答的this条目。

答案 2 :(得分:1)

正如已经详细描述的那样,这意味着该方法不会修改对象的可观察状态。但是,也非常重要的是,它意味着可以在const对象,指针或引用上调用该方法 - 非const方法不能。即:

class A
{
public:
    void Method1() const
    {
    }

    void Method2()
    {
    }
};

int main( int /*argc*/, char * /*argv*/ )
{

    const A a;
    a.Method1(); //ok.
    a.Method2(); //compiler error!

    return 0;
}

答案 3 :(得分:0)

const关键字指定该函数是一个“只读”函数,它不会修改调用它的对象。

答案 4 :(得分:0)

这意味着调用操作符不会改变对象的状态。

答案 5 :(得分:0)

const成员函数承诺不会更改对象的可观察状态。

在引擎盖下,它可能仍会改变状态,例如: mutable名成员但是,mutable成员永远不应该从课堂外的任何地方看到'}接口,即你永远不应该试图欺骗客户端代码,因为客户端代码可能有效地期望const函数不会调整对象的外壳。将mutable视为优化工具(例如,用于缓存和记忆)。


可变性的例子:

你有一个四叉树课。在引擎盖下,四叉树懒洋洋地建立起来,即根据需要;这种懒惰对于班级的用户是隐藏的。现在,该四叉树上的查询方法应为const,因为查询四叉树预计不会更改四叉树。如何在不破坏C ++的情况下实现const-correctness和lazyness?规则是什么?使用mutable。现在你有一个四叉树,用户看起来很常见,但是你知道在幕后,还有很多变化:

class Quadtree {
public:
    Quadtree (int depth);
    Foo query (Bar which) const;

private:
    mutable Node node_;
};