为什么静态成员函数_declared_ static,但是_

这里有一个最小的工作示例:

啊:

class A{
        static int a_member_function();
};

A.cpp

#include "A.h"
int A::a_member_function(){return 5;}


int main(){ return 1;}

这段代码编译并运行,但在我看来,

static int A::a_member_function(){return 5;}

可以很容易地用来定义类A的静态成员函数。实际上,似乎有可能实际上是有用的这个要求,因为它会提醒读者.cpp文件a_member_function是静态的。

但是这显然不行:

error: cannot declare member function ‘static int A::a_member_function()’ to have static linkage [-fpermissive]

那为什么不工作?这个决定背后的原因是什么?

背后的原因是C精神尝试并最小化其关键字的数量,并保持与C的向后兼容性:在该位置的静态具有完全不同的含义。

这一切都恢复到C. C中的“静态”函数是编译单元(.c文件)唯一的函数。它们不能被其他编译单元访问(这是在C中进行封装的一种方式)。此用法在C中仍然有效。您还可以对全局变量执行相同的操作来限制其范围。

虽然在C中,你也想以不同的原因声明成员函数为静态:这些函数属于类,但不需要和所述类的实例运行(我敢打赌,你知道已经,我只是想完成) 。

将成员函数定义为静态会导致矛盾:该函数必须在其翻译单元之外访问。

还有另一种情况是C和C之间的关键字重用,C 11中的auto关键字,但不太可能是一个问题。

注意:
与声明中存在的虚拟关键字相同,而不是定义。

翻译自:https://stackoverflow.com/questions/13531335/why-is-a-static-member-function-declared-static-but-defined-otherwise-in-c

转载注明原文:为什么静态成员函数_declared_ static,但是_