如果多个类有一个共同的静态变量,它们是否共享(在同一范围内?)

syk*_*yko 21 c++ static static-members

我有以下示例代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

B类和C类将A类作为静态成员变量.

我希望程序打印"1 1",但它打印"2 2".

如果多个类有一个共同的静态变量,它们是否共享(在同一范围内?)

son*_*yao 28

静态成员属于类,它无关的对象.

类的静态成员不与类的对象相关联:它们是具有静态存储持续时间的独立对象或在命名空间范围中定义的常规函数​​,在程序中只有一次.

对于你的代码,只有一个A::a,它独立于B::a1C::a1(它们是类的对象A).因此,无论B::a1.aC::a1.a参考A::a.


krz*_*zaq 19

你不是在这里看多个班级.这两个B::a1C::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};
Run Code Online (Sandbox Code Playgroud)

和用户代码:

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;
Run Code Online (Sandbox Code Playgroud)

它将打印:

1, 2
1, 0
Run Code Online (Sandbox Code Playgroud)

那是因为所有人A分享a,但所有人都A拥有自己的分享b.两者CB有自己的A(他们自己的类型的对象之间分别份额)