以下代码抛出错误消息,我无法弄清楚问题是什么 - 是static
还是const
?我究竟做错了什么?
#include <iostream>
using namespace std;
class SampleClass
{
private:
int value;
static int counter;
public:
SampleClass(int i)
{
value = i;
counter++;
}
static int countSomeClass() const
{
return counter;
}
void showValue()
{
cout << value << endl;
}
};
int main()
{
SampleClass test(50);
test.showValue();
test.countSomeClass();
return 0;
}
错误讯息:
main.cpp:16:35:错误:静态成员函数static int SampleClass :: countSomeClass()不能有cv-qualifier
static int countSomeClass()const
答案 0 :(得分:23)
static
方法无法标记为const
:因为它不能在某个实例上运行,所以指定它无法修改它是没有意义的。
(您可能会争辩说,对于static
方法,它可能会引用static
方法,这些方法无法修改与该类关联的static
数据;但是,无论如何这都没有用,因为您不能拥有const
类或形成const
指针或类的引用,因为在C ++类中不是对象)
答案 1 :(得分:13)
正如错误消息所示,静态成员函数不能具有 cv-qualifier - 即const
或volatile
限定符。此类限定符适用于非静态成员中的this
;它们对没有this
的静态成员毫无意义。
您希望函数是静态的,因为它不依赖于任何实例;所以删除const
。
答案 2 :(得分:12)
static
函数不能是const
(cv-qualified),反之亦然。这是问题的两个组合。
来自C ++规范§9.4.1/ 2(强调我的)
[注意:
static
成员函数没有this
指针(9.3.2)。 -end note]static
成员函数不应为virtual
。不应该有static
和具有相同名称和相同参数类型的非静态成员函数(13.1)。static
成员函数不得声明为const
,volatile
或const volatile
。
static
函数没有this
访问权限,因为它与对象的特定实例无关。不需要应用const
,这是没有意义的 - 没有对象的实例可以应用const
。以类似的方式,自由函数不能是const
(或 cv-qualified )。
如果您希望该功能与某个对象相关联,请移除static
,如果您希望static
从您的示例中删除const
- ,请删除const
。
再说一遍;您的counter
已声明但未定义(在课堂外)。它需要在其中一个翻译单元(cpp文件)中使用int SampleClass::counter = 0;
之类的内容。
答案 3 :(得分:5)
这与两者都有关系。
static
成员函数不适用于其所属类的实例。const
关键字表示此成员函数不会修改调用它的实例。因此,在同一个成员函数声明中都没有意义(因此无效)。