我有以下类接口:
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。
答案 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
来限定它。
这就是为什么拥有static
和const
的函数没有意义,因为它们在完全不同的上下文中使用。在调用static
函数时无需担心修改任何对象的状态,因为 没有接收对象 - 它只是像自由函数一样被调用。
答案 5 :(得分:-4)
因为类的static
const
函数没有意义。 const
表示事物(对象/变量)保持不变。静态意味着事物object
等在该上下文中保持不变。