静态函数与静态成员函数 C++

3
我已经阅读了一些有关静态函数和静态成员函数的内容。据我理解,如果一个函数被声明为静态,则该函数仅对其翻译单元可见,其他地方不可见。相反,静态成员函数是一种可以在不实例化其类的任何对象的情况下调用的函数(因此您可以像在名称空间中使用它一样)。
请注意,我所说的静态函数是指这样的内容:
static int foo(int a, int b)
{
   return a + b;
}

而我所指的静态成员函数是

struct MyClass
{
   static int foo(int a, int b)
   {
      return a + b;
   } 
}

这是唯一的区别吗?还是在同一翻译单元内的可见性仍然是它们两个共同的特征?


你是只询问内部/外部链接还是想要了解所有的区别?例如,静态成员函数可以使用类的实例上的点运算符进行调用,而静态非成员函数则不能。 - AndyG
@AndyG,不要涉及语法,主要是关于链接的问题。 - user8469759
一个静态成员函数仍然是一个成员函数,只是不需要对象来调用它(这意味着它没有this指针)。它可以被看作是一个类函数而不是一个对象函数,并且对于所有具有其声明的翻译单元都可用。一个静态非成员(也称为命名空间范围)函数具有静态存储期和内部链接 - Some programmer dude
2
“static” 是一个关键字,其含义取决于上下文。不要因为同一个关键字用于不同的事物而感到困惑(https://en.cppreference.com/w/cpp/keyword/static)。 - 463035818_is_not_a_number
@user8469759:看来你已经很好地理解了。只需记住,在gcc中,默认情况下导出符号,但在MSVC中,我们需要使用__declspec指令显式地导出/导入它们。因此,即使对于静态成员函数,在Windows中它可能不可见,除非你这样做。 - AndyG
为什么这个问题被关闭了?另一个问题问的是何时使用友元函数和静态成员函数... - user8469759
1个回答

8

正如你在这个页面上所看到的,static在不同的使用场景中有着三种不同的含义。

  1. 如果它被用在代码块作用域内,比如在函数内部,则它会使变量跨越函数调用而持续存在。
  2. 如果一个类方法被声明为static,则它不与类的特定实例相关联。
  3. 如果一个命名空间成员被声明为static,则它仅具有内部链接。

好的,那么我发现的差异就是正确的。 - user8469759

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接