【问题标题】:Static function vs Static member functions C++静态函数与静态成员函数 C++
【发布时间】: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


【解决方案1】:

正如您在this page 上看到的,static 实际上有 3 种不同的含义,具体取决于它的使用位置。如果它在块范围内使用,例如在函数内,那么它将使变量在函数调用中保持不变。如果一个类方法被声明为静态的,那么它就不会绑定到该类的特定实例。如果命名空间成员被声明为静态,那么它只有内部链接。

【讨论】:

  • 好的,所以我发现了正确的差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
相关资源
最近更新 更多