假设我有这个程序:
class Foo {
public:
unsigned int bar () {
static unsigned int counter = 0;
return counter++;
}
};
int main ()
{
Foo a;
Foo b;
}
(当然这个例子没有意义,因为我显然将“counter”声明为私有属性,但它只是为了说明问题)。
我想知道C ++在这种情况下的行为:bar()方法中的变量“counter”对于每个实例都是一样的吗?
是, counter
将在所有类型对象的实例之间共享 Foo
在你的可执行文件只要您处于单线程环境中,它就可以像共享计数器一样工作。
在多线程环境中,你将有一些有趣的竞争条件来调试:)。
是, counter
将在所有类型对象的实例之间共享 Foo
在你的可执行文件只要您处于单线程环境中,它就可以像共享计数器一样工作。
在多线程环境中,你将有一些有趣的竞争条件来调试:)。
通过“对每个实例都相同”,你的意思是在每个类实例中共享一个这个变量的实例,然后是的,这是正确的。该类的所有实例都将使用相同的变量实例。
但请记住,对于类变量,在许多情况下,您必须考虑多线程等问题,这是一个完全不同的主题。
从 C ++编程语言(第2版),第200页,作者:Bjarne Stroustrup:
不要用 静态的 除了[plain]函数(第7.1.2节)和类(第10.2.4节)之外。
您的示例距离您可以编译和测试的内容有几行:
#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
所以是的,计数器在所有实例中共享。