假设我有这个程序:
class Foo {
public:
unsigned int bar () {
static unsigned int counter = 0;
return counter++;
}
};
int main ()
{
Foo a;
Foo b;
}
(当然这个例子没有任何意义,因为我显然将“counter”声明为私有属性,但它只是为了说明问题)。
我想知道C ++在这种情况下的行为:bar()方法中的变量“counter”对于每个实例都是相同的吗?
答案 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)
你只需要掌握两件事: