Почему можно получить доступ к static переменной будучи в другом файле?

Рейтинг: 0Ответов: 2Опубликовано: 17.01.2023

Header.h

class A
{
public:
    static int x;
};

Source.cpp

#include "Header.h"
int A::x = 0;

Main.cpp:

#include <iostream>
#include "Header.h"

int main()
{
    std::cout << A::x;
}

static устанавливает внутреннюю связь к переменной. Так как переменная x определена в Source.cpp, то как я могу получить доступ к ней будучи в Main.cpp?

Ответы

▲ 3Принят

Читаем (https://ru.cppreference.com/w/cpp/language/storage_duration), что значит ключевое слово static

static - статическая или потоковая длительность хранения и внутреннее связывание (или внешнее связывание для статических элементов класса, не находящихся в анонимном пространстве имён).

Вот потому, что для статических элементов класса это внешнее связывание, вы и можете обращаться к этой переменной в другом файле.

▲ 3

Ключевое слово статической переменной static позаимствовано из языка Си и при включении в определении класса поменяла тип компоновки на противоположный. (из внутреннего на внешний) Так как элементы класса должны быть доступны в любом отделе программы. Если бы вы попробовали указать точно, что эта переменная статическая в Си смысле, то получите ошибку :

error: ‘static’ may not be used when defining 
  (as opposed to declaring) a static data member [-fpermissive]
static int A::x = 0;

То-есть можно определить переменную статической в Си смысле (в каждом отделе свой внутренний экземпляр) или строго исключительно ⊻ в C++ смысле (одна для всех членов класса и даже может быть приватной).