我有以下示例代码:
class A {
public:
static int a;
};
int A::a = 0;
class B {
public:
static A a1;
};
A B::a1;
class C {
public:
static A a1;
};
A C::a1;
int main(int argc, const char * argv[]) {
C::a1.a++;
B::a1.a++;
std::cout << B::a1.a << " " << C::a1.a << std::endl;
return 0;
}
B类和C类将A类作为静态成员变量。
我希望程序打印&#34; 1 1&#34;但是它打印&#34; 2 2&#34;。
如果多个类有一个共同的静态变量,它们是否共享(在同一范围内?)
答案 0 :(得分:28)
static members属于类,它与对象无关。
类的静态成员不与类的对象关联:它们是具有静态存储持续时间的独立对象或在命名空间作用域中定义的常规函数,在程序中只有一次。
对于您的代码,只有一个A::a
,它独立于B::a1
和C::a1
(它们是类A
的对象)。因此,B::a1.a
和C::a1.a
都是A::a
。
答案 1 :(得分:19)
你不是在这里看多个班级。 B::a1
和C::a1
都属于A
类型。 A
有一个静态变量a
,您可以访问两次。如果您还撰写了A::a++
,则您的计划会打印3 3
稍微修改您的示例:
struct A
{
static int a;
int b;
};
int A::a;
struct B
{
static A a1;
};
A B::a1{0};
struct C
{
static A a2;
};
A C::a2{0};
和用户代码:
B::a1.a = 1; // A's static variable changed
B::a1.b = 2; // B's A's b changed to 2
cout << B::a1.a << ", " << B::a1.b << endl;
cout << C::a2.a << ", " << C::a2.b << endl;
它将打印:
1, 2
1, 0
这是因为所有A
共享a
,但所有A
都有自己的b
。 C
和B
都有自己的A
(它们分别在其类型的对象之间共享)
答案 2 :(得分:0)
B和C都有A的静态实例,这些是A的单独实例,并且它们也有不同的单独实例。但是,A :: a是一个静态变量,它在A的所有实例之间共享,所以:
&amp; B :: a1!=&amp; C :: a1(两个a1是分开的)
但
&amp; B :: a1.a ==&amp; C :: a1.a(即所有A :: a都是相同的,无论是&#39;附上A的实例)