Подтвердить что ты не робот

Если несколько классов имеют общую статическую переменную, разделяются ли они (в пределах одной области?)

У меня есть следующий пример кода:

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".

Если несколько классов имеют общую статическую переменную, они разделены (в пределах той же области?)

4b9b3361

Ответ 1

Элементы static) принадлежат классу, он не имеет ничего общего с объектами.

Статические члены класса не связаны с объектами класса: они являются независимыми объектами со статической продолжительностью хранения или регулярными функциями, определенными в области пространства имен, только один раз в программе.

Для вашего кода существует только один A::a, который не зависит от B::a1 и C::a1 (которые являются объектами класса A). Таким образом, оба B::a1.a и C::a1.a относятся к A::a.

Ответ 2

Вы не смотрите на несколько классов здесь. И 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 static variable changed
B::a1.b = 2; // B A 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 (который они соответственно разделяют между объектами своего типа)

Ответ 3

B и C оба имеют статические экземпляры A, это отдельные экземпляры A и будут иметь разные отдельные экземпляры его членов. Однако A:: a - статическая переменная, которая разделяется между всеми экземплярами A так:

& B:: a1!= & C:: a1 (два a1 являются отдельными)

но

& B:: a1.a == & C:: a1.a(то есть все A:: a одинаковы, независимо от того, "охватывающий" экземпляр A)