Обьяснить код с переменной static
Только начал изучать C++ и застрял на одном простом коде
#include <iostream>
class IDGenerator
{
private:
static int s_nextID;
public:
static int getNextID();
};
int IDGenerator::s_nextID = 1;
int IDGenerator::getNextID() { return s_nextID++; }
int main()
{
for (int count = 0; count < 4; ++count)
std::cout << "The next ID is: " << IDGenerator::getNextID() << '\n';
return 0;
}
Я не могу понять почему можно использовать int IDGenerator::s_nextID = 1; Если переменная находиться в привате.
Ответы (2 шт):
Это не использование, а определение. Попробуйте в main обратиться к ней - скажем,
std::cout << IDGenerator::s_nextID << endl;
и вам тут же компилятор сообщит, что обращаться к private вне класса нельзя.
А тут -
int IDGenerator::getNextID() { return s_nextID++; }
это как раз внутри класса, тут можно - на то и private.
переменная, объявленная static в классе, принадлежит классу, а не экземпляру. И компилятору не так просто решить, где хранить Вашу переменную. Поэтому и был придуман такой трюк. Теперь компилятору очевидно, где он с линковщиком должен разместить место под эту переменную.
Ограничения на такие переменные члены класса постепенно уменьшались и сейчас уже есть inline переменные, которые компилятор умеет сам. Достаточно написать так
static inline int s_nextID = 1;
Правда доступно только с 17 плюсов.
Но тут есть ещё один интересный момент. Если в классе есть ещё одна статическая переменная (допустим s_nextID2), то можно написать так
int IDGenerator::s_nextID = 1;
int IDGenerator::s_nextID2 = IDGenerator::s_nextID + 1;
и все будет работать:)