抛出错误的是static还是const

What is throwing the error the static or the const?

本文关键字:static 还是 const 出错 错误      更新时间:2023-10-16

下面的代码抛出了一条错误消息,我不知道问题出在哪里——是单词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限定符
static int countSomeClass()const

static方法不能标记为const:因为它在实例上不起作用,所以指定它不能修改它是没有意义的。

(您可能会争辩说,对于static方法,它可能引用了static方法,这些方法不能修改与类关联的static数据;但是,这无论如何都没有用,因为您不能有const类,也不能形成const指针或对类的引用,因为在C++中,类不是对象)

正如错误消息所说,静态成员函数不能有cv限定符,即constvolatile限定符。这样的限定符被应用于非静态成员内的CCD_ 12;它们在不具有CCD_ 13的静态成员上没有意义。

您希望函数是静态的,因为它不依赖于任何实例;因此移除CCD_ 14。

static函数不能是const(cv限定),反之亦然。问题在于两者的组合

根据C++规范§9.4.1/2(强调矿井)

[注:static成员函数没有this指针(9.3.2)。--结束语]static成员函数不应为virtual。不应存在具有相同名称和参数类型(13.1)的static和非静态成员函数。static成员函数不应声明为constvolatileconst volatile

static函数没有this访问权限,因为它与对象的特定实例无关。没有必要应用const,这是没有意义的-没有对象的实例可以应用const。同样,自由函数不能是const(或cv限定)。

如果希望函数与对象关联,请删除static;如果希望函数为static,请从示例中删除const-,并删除const

再来一个音符;您的counter已声明但未定义(在类之外)。它在其中一个翻译单元(cpp文件)中需要类似int SampleClass::counter = 0;的内容。

这两者都有关系。

  • static成员函数不适用于它所属类的实例
  • 成员函数签名末尾的const关键字表示该成员函数不会修改它在上调用的实例

因此,在同一个成员函数声明中同时使用这两个函数是没有意义的(因此也是无效的)。