【问题标题】:If multiple classes have a static variable in common, are they shared (within the same scope?)如果多个类有一个共同的静态变量,它们是否共享(在同一范围内?)
【发布时间】:2016-10-18 02:14:49
【问题描述】:

我有以下示例代码:

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 类作为静态成员变量。

我预计程序会打印“1 1”,但它会打印“2 2”。

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

【问题讨论】:

  • 添加对象B b1,b2C c1,c2, c3可能会让人大开眼界。

标签: c++ static static-members


【解决方案1】:

static members 属于类,与对象无关。

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

对于您的代码,只有一个A::a,它独立于B::a1C::a1(它们是A 类的对象)。所以B::a1.aC::a1.a 都指的是A::a

【讨论】:

    【解决方案2】:

    您在这里查看的不是多个课程。 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};
    

    和用户代码:

    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
    

    这是因为所有As 共享a,但所有As 都有自己的bCB 都有自己的 A(它们分别在其类型的对象之间共享)

    【讨论】:

      【解决方案3】:

      B 和 C 都具有 A 的静态实例,它们是 A 的单独实例,并且它的成员也将具有不同的单独实例。但是,A::a 是一个静态变量,在 A 的所有实例之间共享,所以:

      &B::a1 != &C::a1(两个a1是分开的)

      但是

      &B::a1.a == &C::a1.a(即所有 A::a 都是相同的,无论 A 的“封闭”实例如何)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        • 2017-01-17
        • 2019-06-20
        • 1970-01-01
        • 2012-11-14
        • 1970-01-01
        相关资源
        最近更新 更多