将C ++成员函数声明为static const会产生错误

时间:2011-08-30 23:53:57

标签: c++ access-modifiers

我有以下类接口:

class Test
{
public: 
    Test();
    static void fun() const;

private:
    int x;
    static int i;
};

Test.cpp包含fun()的实现:

void Test::fun() const
{
   cout<<"hello";
}

它给了我错误...... modifiers not allowed on static member functions

错误是什么意思?我想知道为什么我不能创建一个静态的函数以及const。

6 个答案:

答案 0 :(得分:5)

void fun() const;

意味着fun可以应用于const对象(以及非const)。 如果没有const修饰符,它只能应用于非const对象。

根据定义,静态函数不需要对象。

答案 1 :(得分:2)

成员函数是const意味着无法调用类实例的其他非const成员

自由函数不是成员函数,因此它与类或类实例无关,因此它不能是const,因为没有成员

静态函数是一个自由函数,它的名称作用于类名,使其始终相对于类型,但与该类型的实例无关,因此仍然没有成员可以访问至即可。

在最后两种情况下,没有使用const访问的意义,因为没有成员可以访问。

答案 2 :(得分:1)

静态函数在没有实例的情况下工作,而const保证函数不会更改实例(即使它需要实例)。

如果您看到翻译的代码,可能会更容易理解:

   static void fun();

在一天结束时被转换为不带参数的函数,即

   void fun();

对于另一个例子,

   void fun() const;

在一天结束时转换为表格

的功能
   fun(const Test& self)

因此,static void fun() const有两个相互矛盾的含义。

BTW:所有成员函数(const或不是const)都会发生此转换

答案 3 :(得分:0)

几个小时前我在这里回答了这个问题:Why we need to put const at end of function header but static at first?

(SO系统对我的回复不满意。自动转换为评论)

答案 4 :(得分:0)

也许有一个简单的代码示例会有所帮助。

class Foo {
public:
    static void static_function();
    void const_function() const;
};

// Use of static function:
Foo::static_function();

// Use of const function:
Foo f;
f.const_function();

两者之间的关键区别在于const函数是成员函数 - 也就是说,它是在Foo类的实例上调用的。这意味着您首先需要实例化Foo类型的对象,然后该对象充当对const_function的调用的接收者。 const本身意味着您不会修改作为该函数调用的接收者的对象的状态。

另一方面,static函数本质上是一个自由函数,您可以在没有接收对象的情况下调用它。但是,在定义它的类的范围之外,您需要使用类名Foo::static_function来限定它。

这就是为什么拥有staticconst的函数没有意义,因为它们在完全不同的上下文中使用。在调用static函数时无需担心修改任何对象的状态,因为 没有接收对象 - 它只是像自由函数一样被调用。

答案 5 :(得分:-4)

因为类的static const函数没有意义。 const表示事物(对象/变量)保持不变。静态意味着事物object等在该上下文中保持不变。