【发布时间】:2012-03-20 16:32:01
【问题描述】:
有一个class A,它具有以下operator() 实现:
void A::operator()(...parameters...) const
{
// operator body
}
const 是什么意思?
【问题讨论】:
有一个class A,它具有以下operator() 实现:
void A::operator()(...parameters...) const
{
// operator body
}
const 是什么意思?
【问题讨论】:
C++ 中的方法可以像上面的例子一样标记为const,表示该函数不修改实例。为了强制执行这一点,this 指针在方法中属于 const A* const 类型。
通常,方法中的this 指针是A* const,表示我们无法更改this 指向的内容。也就是说,我们不能做this = new A()。
但是当类型为const A* const 时,我们也无法更改任何属性。
【讨论】:
this的原因是因为它不是一个lvalue表达式,而不是因为它有一个它没有的const限定类型.事实上,您不能拥有const 限定的非类类型的右值。
const A* const:publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/…msdn.microsoft.com/en-us/library/ytk2ae82.aspx
this 的部分和第 3 章中关于值类别的部分。
mutable的成员。
该方法使用this作为const A*,然后只能调用其他const方法。
请参阅 CPP 常见问题解答的 this 条目。
【讨论】:
const A* const
const A*。 this 是一个 rvalue,这就是为什么你不能分配给它或获取它的地址,而不是因为它是 const。
正如已经充分描述的,这意味着该方法不会修改对象的可观察状态。而且,非常重要的是,这意味着可以在 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;
}
【讨论】:
const 关键字指定该函数是“只读”函数,不会修改调用它的对象。
【讨论】:
表示调用操作符不会改变对象的状态。
【讨论】:
const_cast 和mutable。
const_cast 改变常量值会产生未定义的行为。
const,因为查询四叉树预计不会改变四叉树。如何在不违反 C++ 规则的情况下实现 const 正确性和惰性?使用mutable。现在您有了一个对于用户来说看起来是 const 的四叉树,但您知道在底层,还有很多变化。
const 成员函数承诺不会改变对象的可观察状态。
在底层,它可能仍会改变状态,例如的mutable 成员。但是,mutable 成员永远不应该从类接口之外的任何地方可见,即您永远不应该试图对客户端代码撒谎,因为客户端代码可能有效地期望 const 函数不会调整对象的外壳。将mutable 视为一种优化工具(例如,用于缓存和记忆)。
可变性示例:
你有一个四叉树类。在引擎盖下,四叉树是惰性构建的,即按需构建;这种懒惰对班级的用户是隐藏的。现在,对该四叉树的查询方法应该是const,因为查询四叉树预计不会改变四叉树。如何在不违反 C++ 规则的情况下实现 const 正确性和惰性?使用mutable。现在你有一个对于用户来说看起来是 const 的四叉树,但你知道在底层,还有很多变化:
class Quadtree {
public:
Quadtree (int depth);
Foo query (Bar which) const;
private:
mutable Node node_;
};
【讨论】: