【发布时间】:2020-04-20 11:58:34
【问题描述】:
我读过一些关于静态函数和静态成员函数的文章。据我了解,如果一个 function 被声明为静态的,那么这个函数只对它的翻译单元可见,而在其他任何地方都看不到。相反,静态成员函数是一个无需实例化其类的任何对象即可调用的函数(因此您可以像在名称空间中一样使用它)。
为了澄清静态函数,我的意思是
static int foo(int a, int b)
{
return a + b;
}
我的意思是静态成员函数
struct MyClass
{
static int foo(int a, int b)
{
return a + b;
}
}
这是唯一的区别吗?还是在同一个翻译单元中的可见性仍然是他们两个的共同特征?
【问题讨论】:
-
您是只询问内部/外部链接还是寻找所有差异?例如,可以在类的实例上使用点运算符调用静态成员函数,而静态非成员函数则不能。
-
@AndyG,语法无关。主要是关于联动。
-
静态成员函数仍然是成员函数,只是不需要调用对象(这意味着它没有
this指针)。它可以被视为一个类函数而不是一个对象函数,并且可用于所有具有它的声明的翻译单元。静态非成员(也称为命名空间范围)函数具有静态 storage duration 和内部 linkage。 -
static是根据上下文具有不同含义的关键字之一。不要被用于不同事物的相同关键字混淆 (en.cppreference.com/w/cpp/keyword/static) -
@user8469759:那么看来您已经足够了解它了。请记住,在 gcc 中符号是默认导出的,但在 MSVC 中,我们需要使用
__declspec指令显式导出/导入它们。因此,即使对于静态成员函数,它也可能在 Windows 的翻译单元之外不可见,除非您这样做。
标签: c++ static-methods static-functions