为什么静态成员函数定义没有关键字'static'?

joh*_*een 17 c++ static

根据C++中'static'关键字的这个链接:

static关键字仅与类定义中的静态成员的声明一起使用,但不与该静态成员的定义一起使用.

为什么成员函数定义中禁止使用static关键字?我确实理解在其定义中将函数重新声明为"静态"是多余的.但是在编译函数定义时使用它应该是无害的,因为它不会导致任何歧义.那么为什么编译器会禁止它呢?

Sto*_*ica 17

有歧义好吧.相同的定义根本不需要成员函数.

考虑一下:

namespace foo {
    static void bar();
}

static void foo::bar() {

}
Run Code Online (Sandbox Code Playgroud)

foo::bar需要,以具有相同的链接说明符来定义.

但是,对于成员函数,static它不是链接说明符.如果允许的话,定义的正确性foo::bar非常依赖于什么foo.static实际上,禁止减轻了编译器的负担.

将其扩展到一般成员,而不仅仅是成员函数,是一致的问题.


cma*_*ter 5

关键是,它static有几个非常不同的含义:

class Foo {
    static void bar();
}
Run Code Online (Sandbox Code Playgroud)

这里static关键字意味着该函数bar与该类相关联Foo,但不是在该类的实例上调用Foo。的这个含义static与面向对象密切相关。然而,声明

static void bar();
Run Code Online (Sandbox Code Playgroud)

含义非常不同:这意味着bar仅在文件范围内可见,该函数不能直接从其他编译单元调用。

你看,如果你static在类声明中说,以后将函数限制在文件范围内是没有任何意义的。如果您有一个static函数(具有文件范围),则将其作为公共头文件中类定义的一部分发布是没有意义的。这两个含义是如此不同,以至于它们实际上相互排斥。


static具有更多、独特的含义:

void bar() {
    static int hiddenGlobal = 42;
}
Run Code Online (Sandbox Code Playgroud)

是另一个意思,类似于,但不完全相同

class Foo {
    static int classGlobal = 6*7;
}
Run Code Online (Sandbox Code Playgroud)

编程时,单词在所有上下文中并不总是具有相同的含义。