繁体   English   中英

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

[英]Declaring C++ member function as static const yields errors

我有以下类接口:

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的函数。

void fun() const;

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

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

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

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

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

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

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

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

   static void fun();

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

   void fun();

对于另一个例子,

   void fun() const;

在一天结束时被转换为表格的功能

   fun(const Test& self)

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

顺便说一句:这个转换发生在所有成员函数中(const或不是)

几个小时前我在这里回答了这个问题: 为什么我们需要将const放在函数头的末尾但是首先是静态的?

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

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

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_function const本身意味着您不会修改作为该函数调用的接收者的对象的状态。

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

这就是为什么有一个staticconst的函数是没有意义的,因为它们在完全不同的上下文中使用。 有没有必要担心调用时修改任何对象的状态static函数,因为没有接收对象-这只不过是调用像一个免费的功能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM