有一个class A
,它有以下operator()
实现:
void A::operator()(...parameters...) const
{
// operator body
}
这const
是什么意思?
答案 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_;
};