Почему можно получить доступ к static переменной будучи в другом файле?
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?
Ответы (2 шт):
Читаем (https://ru.cppreference.com/w/cpp/language/storage_duration), что значит ключевое слово static
static- статическая или потоковая длительность хранения и внутреннее связывание (или внешнее связывание для статических элементов класса, не находящихся в анонимном пространстве имён).
Вот потому, что для статических элементов класса это внешнее связывание, вы и можете обращаться к этой переменной в другом файле.
Ключевое слово статической переменной static позаимствовано из языка Си и при включении в определении класса поменяла тип компоновки на противоположный. (из внутреннего на внешний) Так как элементы класса должны быть доступны в любом отделе программы. Если бы вы попробовали указать точно, что эта переменная статическая в Си смысле, то получите ошибку :
error: ‘static’ may not be used when defining
(as opposed to declaring) a static data member [-fpermissive]
static int A::x = 0;
То-есть можно определить переменную статической в Си смысле (в каждом отделе свой внутренний экземпляр) или строго исключительно ⊻ в C++ смысле (одна для всех членов класса и даже может быть приватной).