关于C++:成员函数中的静态变量

Static variables in member functions

有人能解释一下C++中成员函数中的静态变量是如何工作的。

考虑到以下类别:

1
2
3
4
5
6
class A {
   void foo() {
      static int i;
      i++;
   }
}

如果我声明多个A实例,那么在一个实例上调用foo()是否会增加所有实例上的静态变量i?还是只有那个电话?

我假设每个实例都有自己的i副本,但我已经指出了一些代码。


由于class A是非模板类,A::foo()是非模板函数。程序中只有一个static int i的副本。

A对象的任何实例都会影响同一个ii的生存期将贯穿整个程序。要添加示例:

1
2
3
4
5
A o1, o2, o3;
o1.foo(); // i = 1
o2.foo(); // i = 2
o3.foo(); // i = 3
o1.foo(); // i = 4


遗憾的是,EDCOX1的6个词在C++中有几个不同的含义。

  • 当用于数据成员时,这意味着数据是在类中分配的,而不是在实例中分配的。

  • 当用于函数内部的数据时,这意味着数据是静态分配的,在第一次输入块时初始化,并持续到程序退出为止。此外,变量仅在函数内部可见。局部静力学的这个特殊特性经常被用来实现单例的惰性构造。

  • 当在编译单元级别(模块)使用时,它意味着变量就像一个全局变量(即,在运行main之前分配和初始化,在main退出之后销毁),但在其他编译单元中该变量将不可访问或不可见。

  • 我对每种使用中最重要的部分进行了强调。不鼓励使用(3)来支持未命名的命名空间,这些命名空间还允许未导出的类声明。

    在您的代码中,static关键字与意义数字2一起使用,与类或实例无关…它是函数的一个变量,只有一个副本。

    然而,正如iammilind所说的,如果函数是一个模板函数,那么该变量可能有多个实例(因为在这种情况下,函数本身可以在程序的许多不同副本中出现)。即使在这种情况下,类和实例也不相关…请参见以下示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>

    template<int num>
    void bar()
    {
        static int baz;
        printf("bar<%i>::baz = %i
    "
    , num, baz++);
    }

    int main()
    {
        bar<1>(); // Output will be 0
        bar<2>(); // Output will be 0
        bar<3>(); // Output will be 0
        bar<1>(); // Output will be 1
        bar<2>(); // Output will be 1
        bar<3>(); // Output will be 1
        bar<1>(); // Output will be 2
        bar<2>(); // Output will be 2
        bar<3>(); // Output will be 2
        return 0;
    }


    简化答案:

    静态变量,不管它们是(非模板化的)class或(非模板化的)函数的成员,在技术上表现得像一个全局标签,其作用域仅限于class或函数。