37

这是错误:

error: static member function ‘static void myClass::myfunct()’ cannot have cv-qualifier

有人可以解释这个错误以及为什么不能使用 const 。

#include<iostream>
class myClass{      
   static void myfunct() const 
   { 
     //do something
   }
};

int main()
{
   //some code
   return 0;
}
4

5 回答 5

52

值得在这里引用标准

9.4.1 静态成员函数

2) [ 注意:静态成员函数没有 this 指针 (9.3.2)。—尾注]static成员函数不应该是virtual。不应存在​​具有相同名称和相同参数类型(13.1)static的非成员函数。static

静态成员函数不得声明为constvolatileconst volatile

static函数没有this参数。他们不需要 cv 限定符。

请参阅James McNellis 的这个答案

当您将const限定符应用于非静态成员函数时,它会影响this指针。对于 class 的 const 限定成员函数Cthis指针是 type C const*,而对于非 const 限定成员函数,this指针是 type C*

于 2013-11-06T13:05:50.823 回答
13

成员函数未绑定到其类的static实例,因此它是const和/或volatile(即“cv-qualified”)没有意义,因为在调用它时没有实例可以应用const或应用volatile功能。

于 2013-11-06T13:03:19.197 回答
4

写在那里没有意义const,因为函数是static,因此没有可以在其上注入上const​​下文的类实例。因此,它被视为错误。

于 2013-11-06T13:05:58.873 回答
1

成员函数声明中的限定符 const 应用于指向类 this 的对象的指针。由于静态函数不绑定到类的对象,它们没有隐式参数 this。所以限定符 const 对这些函数没有任何意义。

于 2013-11-06T13:12:07.180 回答
1

成员函数的 const 限定符意味着该函数不会更改对象实例,并且可以在 const 对象上调用。静态成员函数未绑定到任何对象实例,因此将它们设为 const 毫无意义,因为您不会在任何对象上调用静态成员函数。这就是标准禁止它的原因。

class Foo
{
public:
    void memberFunc();
    static void staticMemberFunc();
}

Foo f;
f.memberFunc();          // called on an object instance
Foo::staticMemberFunc(); // not called on an object instance
于 2013-11-06T13:29:48.873 回答