Инициализация статической переменной для классов в С++, зачем включать тип данных?

Я изучаю С++, и я сталкивался с статической переменной (у меня есть предварительные знания из C89), и в используемом ресурсе они объявили статическую переменную в классе, например:

class nameHere
{
    public:
        static int totalNum;
}

int nameHere::totalNum = 0;

int main()
{}

Например. Я не понимаю, что, поскольку я уже заявил, что статическая переменная является целым числом в определении класса, зачем мне также объявлять ее как целое вне определения класса? Не имеет смысла просто инициализировать его так:

nameHere::totalNum = 0;

int main()
{}

Есть ли конкретная причина или просто соглашение С++? Спасибо за помощь!

Ответ 1

Это могло бы (возможно) сделать язык еще сложнее разобрать (и это уже почти безумно сложно разобрать).

Как бы то ни было, тип данных (int, long, my_class, что угодно) сообщает компилятору, что то, что он видит, является началом объявления (которое в этом случае также является определением). Без этого компилятор будет иметь более сложное время, сортируя вещи.

В конкретном случае вещей в глобальном масштабе это было бы не так уж плохо, потому что в глобальном масштабе все, что у вас есть, - это серия объявлений. Однако в любом другом аспекте все будет сложнее (и иметь одно правило в глобальном масштабе, а другое в другом месте будет уродливо).

Ответ 2

В С++ 11 вы можете просто инициализировать переменную внутри класса:

class nameHere
{
    public:
        static const int totalNum = {0};
}

Ответ 3

Существует различие между определением и декларацией. Пока статическая переменная в классе была объявлена, она не определена. Одно правило определения, объясняет декларации и определения и состояния

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

Следовательно, при объявлении переменной должен использоваться полный тип объекта.