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;
}
这不完全正确,因为您可以将成员标记为可变,然后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
标签:c,declaration,const,c-faq 来源: https://codeday.me/bug/20190911/1802841.html