Почему мы не можем получить доступ к закрытому статическому члену вне класса без публичной функции-члена?
Это может быть глупым сомнением, но я не могу понять, почему я не могу получить доступ к частному члену статических данных вне класса, когда мне разрешено его определять.
Например: в следующем коде:
class foo
{
static int A;
public:
int getA{return A;}
};
//This is allowed
int foo:A=0;
int main()
{
//This gives error
cout<<foo:A;
}
1 ответ
int foo::A = 0;
выделяет память для переменной-члена A
и инициализирует его 0
(фактически статический по умолчанию инициализируется с 0
, так что назначение излишне). Вы делаете это только один раз в файле реализации.cpp. Тогда каждый сможет создать экземпляр вашего класса без проблем с компоновщиком. Обратите внимание, что вы не можете сделать это снова, т.е. назначить позже foo::A = 42;
не будет компилироваться, поэтому вы не нарушаете никаких правил доступа. Тот факт, что вы должны явно выделять хранилище, является языковым правилом, которое, на мой взгляд, создает больше путаницы (я бы заставил компилятор автоматически выделять хранилище, когда вы объявляете статическое).
Таким образом, в заключение можно сказать, что иметь возможность определять личный член не так опасно, как возможность позднее получить к нему доступ или изменить его, и он сильно отличается от последнего. Объект уже запечатан для внешнего мира, когда члену выделено его хранилище.