C ++方法声明中最后一个“const”的含义?
const
在这些声明中的含义是什么? const
让我困惑。
class foobar
{
public:
operator int () const;
const char* foo() const;
};
将const
关键字添加到方法时, this
指针本质上将成为指向const
对象的指针,因此不能更改任何成员数据。 (除非你使用mutable
,稍后更多)。
const
关键字是函数签名的一部分,这意味着您可以实现两个类似的方法,一个是在对象为const
时调用的,另一个不是。
#include <iostream>
class MyClass
{
private:
int counter;
public:
void Foo()
{
std::cout << "Foo" << std::endl;
}
void Foo() const
{
std::cout << "Foo const" << std::endl;
}
};
int main()
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
}
这将输出
Foo
Foo const
在非const方法中,您可以更改实例成员,这是您在const
版本中无法做到的。 如果将上例中的方法声明更改为下面的代码,则会出现一些错误。
void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}
这并不完全正确,因为您可以将成员标记为mutable
,然后可以使用const
方法更改它。 它主要用于内部计数器和东西。 解决方案是下面的代码。
#include <iostream>
class MyClass
{
private:
mutable int counter;
public:
MyClass() : counter(0) {}
void Foo()
{
counter++;
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++;
std::cout << "Foo const" << std::endl;
}
int GetInvocations() const
{
return counter;
}
};
int main(void)
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
std::cout << "The MyClass instance has been invoked " << ccc.GetInvocations() << " times" << endl;
}
这将输出
Foo
Foo const
The MyClass instance has been invoked 2 times
const意味着该方法承诺不会改变该类的任何成员。 即使对象本身被标记为const
,您也可以执行已标记的对象成员:
const foobar fb;
fb.foo();
将是合法的。
查看C ++中“const”的用法和用法? 了解更多信息。
const
限定符意味着可以在任何foobar
值上调用这些方法。 当你考虑在一个const对象上调用一个非const方法时,会有所不同。 考虑一下你的foobar
类型是否有以下额外的方法声明:
class foobar {
...
const char* bar();
}
bar()
方法是非const的,只能从非const值访问。
void func1(const foobar& fb1, foobar& fb2) {
const char* v1 = fb1.bar(); // won't compile
const char* v2 = fb2.bar(); // works
}
但是, const
背后的想法是标记不会改变类内部状态的方法。 这是一个强大的概念,但在C ++中实际上并不可行。 这更多的是承诺而不是保证。 还有一个经常破碎而且容易破碎。
foobar& fbNonConst = const_cast<foobar&>(fb1);
链接地址: http://www.djcxy.com/p/1053.html
上一篇: Meaning of "const" last in a C++ method declaration?
下一篇: What does the C++ standard state the size of int, long type to be?