Обьяснить код с переменной 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 шт):

Автор решения: Harry

Это не использование, а определение. Попробуйте в main обратиться к ней - скажем,

std::cout << IDGenerator::s_nextID << endl;

и вам тут же компилятор сообщит, что обращаться к private вне класса нельзя.

А тут -

int IDGenerator::getNextID() { return s_nextID++; }

это как раз внутри класса, тут можно - на то и private.

→ Ссылка
Автор решения: KoVadim

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

Ограничения на такие переменные члены класса постепенно уменьшались и сейчас уже есть inline переменные, которые компилятор умеет сам. Достаточно написать так

static inline int s_nextID = 1;

Правда доступно только с 17 плюсов.

Но тут есть ещё один интересный момент. Если в классе есть ещё одна статическая переменная (допустим s_nextID2), то можно написать так

int IDGenerator::s_nextID = 1;
int IDGenerator::s_nextID2 = IDGenerator::s_nextID + 1;

и все будет работать:)

→ Ссылка