成员函数中的静态变量

有人能解释一下在c++中成员函数中的静态变量是如何工作的吗?

给定以下类:

class A {
void foo() {
static int i;
i++;
}
}

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

我假设每个实例都有自己的i副本,但逐步通过一些代码似乎表明情况并非如此。

107418 次浏览

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

A对象的任何实例都将影响相同的i,而i的生命周期将在整个程序中保持不变。添加一个例子:

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

不幸的是,关键字static在c++中有几个不同的不相关的含义

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

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

  3. 当在编译单元级别(模块)使用时,它意味着变量类似于全局变量(即在main运行之前分配和初始化,并在main退出后销毁),但变量将无法在其他编译单元中访问或可见。

我强调了对每种用途来说最重要的部分。不鼓励使用(3)来支持未命名的名称空间,因为它还允许未导出的类声明。

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

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

#include <stdio.h>


template<int num>
void bar()
{
static int baz;
printf("bar<%i>::baz = %i\n", 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或函数。

函数内部的静态变量

  • 静态变量是在函数内部创建的,存储在程序的静态内存中而不是堆栈中。

  • 静态变量初始化将在函数的第一次调用时完成。

  • 静态变量将在多个函数调用中保留值

  • 静态变量的生存期为Program

enter image description here

例子

#include <iostream>


using namespace std;


class CVariableTesting
{
public:
    

void FuncWithStaticVariable();
void FuncWithAutoVariable();


};


void CVariableTesting::FuncWithStaticVariable()
{
static int staticVar = 0; //staticVar is initialised by 0 the first time
cout<<"Variable Value : "<<staticVar<<endl;
staticVar++;
}
void CVariableTesting::FuncWithAutoVariable()
{
int autoVar = 0;
cout<<"Variable Value : "<<autoVar<<endl;
autoVar++;
}
    



int main()
{
CVariableTesting objCVariableTesting;
cout<<"Static Variable";
objCVariableTesting.FuncWithStaticVariable();
objCVariableTesting.FuncWithStaticVariable();
objCVariableTesting.FuncWithStaticVariable();
objCVariableTesting.FuncWithStaticVariable();
objCVariableTesting.FuncWithStaticVariable();
    

cout<<endl;
cout<<"Auto Variable";
objCVariableTesting.FuncWithAutoVariable();
objCVariableTesting.FuncWithAutoVariable();
objCVariableTesting.FuncWithAutoVariable();
objCVariableTesting.FuncWithAutoVariable();
objCVariableTesting.FuncWithAutoVariable();
    

return 0;
}

输出:

静态变量

变量值:0
变量值:1
变量值:2
变量值:3
变量值:4

自动变量

变量值:0
变量值:0
变量值:0
变量值:0
变量值:0