class A
{
public:
A():member_()
{
}
int hashGetter() const
{
state_ = 1;
return member_;
}
int goodGetter() const
{
return member_;
}
int getter() const
{
//member_ = 2; // error
return member_;
}
int badGetter()
{
return member_;
}
private:
mutable int state_;
int member_;
};
考试
int main()
{
const A a1;
a1.badGetter(); // doesn't work
a1.goodGetter(); // works
a1.hashGetter(); // works
A a2;
a2.badGetter(); // works
a2.goodGetter(); // works
a2.hashGetter(); // works
}
7 回答
C++ Common Knowledge: Essential Intermediate Programming中Const成员函数的含义给出了清楚的解释:
所以在你的代码中:
你可以这样认为:
将
const
关键字添加到方法时,this
指针实际上将成为指向const
对象的指针,因此您无法更改任何成员数据 . (除非您使用mutable
,稍后会详细介绍) .const
关键字是函数签名的一部分,这意味着您可以实现两个类似的方法,一个在对象是const
时调用,另一个不是 .这将输出
在非const方法中,您可以更改实例成员,而这些成员在
const
版本中无法执行 . 如果您将上面示例中的方法声明更改为以下代码,则会出现一些错误 .这不完全正确,因为您可以将成员标记为
mutable
,然后const
方法可以更改它 . 它主要用于内部计数器和东西 . 解决方案就是下面的代码 .哪个会输出
const意味着该方法承诺不会改变该类的任何成员 . 即使对象本身已标记为
const
,您_111781_的成员也会如此标记:是合法的 .
有关更多信息,请参见How many and which are the uses of “const” in C++? .
const
限定符意味着可以在foobar
的任何值上调用这些方法 . 当您考虑在const对象上调用非const方法时会出现差异 . 考虑您的foobar
类型是否具有以下额外方法声明:方法
bar()
是非const的,只能从非const值访问 .const
背后的想法是标记不会改变类的内部状态的方法 . 这是一个强大的概念,但在C中实际上并不强制执行 . 这更像是承诺而非保证 . 而且经常被打破并容易被打破的人 .这些const表示如果方法'with const'改变内部数据,编译器将出错 .
考试
有关更多信息,请阅读this
布莱尔的回答是正确的 .
但请注意,有一个
mutable
限定符可以添加到类的数据成员中 . 如此标记的任何成员都可以在const
方法中进行修改,而不会违反const
Contract .如果希望对象记住调用特定方法的次数,而不影响该方法的“逻辑”常量,则可能需要使用此(例如) .
当您在方法签名中使用
const
时(就像您所说的:const char* foo() const;
),您告诉编译器this
指向的内存不能通过此方法更改(这里是foo
) .