成员函数中的静态变量

时间:2011-06-03 05:33:53

标签: c++ static scope

有人可以解释成员函数中的静态变量如何在C ++中工作。

鉴于以下课程:

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

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

我假设每个实例都有自己的i副本,但是我已经通过一些代码来表示其他情况。

4 个答案:

答案 0 :(得分:148)

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

A对象的任何实例都会影响相同的ii的生命周期将保留在整个程序中。添加示例:

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

答案 1 :(得分:122)

遗憾的是,关键字static在C ++中有一些不相关的含义

  1. 用于数据成员时,表示数据在类中分配,而不是在实例中。

  2. 当用于函数内部的数据时,表示数据是静态分配的,在第一次输入块时初始化并持续到程序退出。此变量仅在函数内部可见。局部静力学的这一特殊功能通常用于实现单身人士的懒惰建构。

  3. 在编译单元级别(模块)使用时,意味着该变量就像一个全局变量(即main运行之前分配和初始化,并在main退出后销毁)但是该变量在其他编译单元中无法访问或显示

  4. 我更加强调了对每种用途最重要的部分。稍微不鼓励使用(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;
    }
    

答案 2 :(得分:1)

函数内部的静态变量

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

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

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

  • 静态变量的生命周期为“程序”

enter image description here

示例

#include <iostream>

using namespace std;

class CVariableTesting 
{
    public:

    void FuncWithStaticVariable();
    void FuncWithAutoVariable();

};

void CVariableTesting::FuncWithStaticVariable()
{
    static int staticVar;
    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

答案 3 :(得分:-2)

简化回答:

静态变量,无论它们是否是(非模板化的)class或(非模板化)函数的成员,都在技术上表现得像一个全局标签,其范围仅限于{{1}或者功能。