c++ - 为什么静态成员函数_declared_是静态的,而在C++中却是_defined_?

标签 c++ static scope static-methods

这是一个最小的工作示例:

啊哈:

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 的向后兼容性:static 在那个位置具有完全不同的含义。

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

不过,在 C++ 中,您还希望将成员函数声明为 static ,原因不同:这些函数属于类,但不需要运行所述类的实例(我打赌你知道已经,我只是想完整)。

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

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

注意: 同样的事情发生在 virtual 关键字出现在声明中而不是定义中。

关于c++ - 为什么静态成员函数_declared_是静态的,而在C++中却是_defined_?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13531335/

相关文章:

c++ - C++实现的基数排序

JAVA - 无法对非静态方法进行静态引用

c - 错误 : redefinition of "a static variable" in C header files

java - 如何在 XML 中设置 Spring Scope

java - 在java中使用for循环时变量的范围 - eclipse/编译器错误?

c++ - 为什么在 C++ 中调用此运算符?

C++构造了一系列没有默认构造函数的相互依赖的类?

scope - 未捕获闭包范围? — CoffeeScript

C++:bool 是 1 位变量吗?

c++ - 可以在 C++ 中将类声明为静态的吗?