实例方法中的静态变量

时间:2010-01-29 18:11:22

标签: c++ static-variables instance-methods

假设我有这个程序:

class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;
}

(当然这个例子没有任何意义,因为我显然将“counter”声明为私有属性,但它只是为了说明问题)。

我想知道C ++在这种情况下的行为:bar()方法中的变量“counter”对于每个实例都是相同的吗?

5 个答案:

答案 0 :(得分:10)

是的,counter将在您的可执行文件中Foo类型的所有对象实例之间共享。只要您处于单线程环境中,它就可以像共享计数器一样工作。

在多线程环境中,你将有一些有趣的竞争条件来调试:)。

答案 1 :(得分:2)

通过“对每个实例都相同”,你的意思是在每个类实例中共享一个这个变量的实例,然后是,这是正确的。该类的所有实例都将使用相同的变量实例。

但请记住,对于类变量,在很多情况下你必须考虑多线程等问题,这是一个完全不同的主题。

答案 2 :(得分:1)

来自 C ++编程语言(第2版),第200页,作者:Bjarne Stroustrup:

  

除了[plain]函数(第7.1.2节)和类(第10.2.4节)之外,不要使用 static

答案 3 :(得分:1)

你的例子距离你可以编译和测试的东西还有几行:

#include <iostream>
using namespace std;
class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;

    for (int i=0; i < 10; i++)
      cout<<i<<". "<<a.bar()<<" / "<<b.bar()<<endl;
}

输出如下:

0. 1 / 0
1. 3 / 2
2. 5 / 4
3. 7 / 6
4. 9 / 8
5. 11 / 10
6. 13 / 12
7. 15 / 14
8. 17 / 16
9. 19 / 18

所以是的,计数器在所有实例中共享。

答案 4 :(得分:0)

你只需要掌握两件事:

  1. 静态变量存储在执行程序的静态区域(与全局变量的静态区域相同)。
  2. 范围受限于括号的一般规则。另外,静态变量具有内部联系。