Подтвердить что ты не робот

Статическая переменная в объявлении или определении класса?

Я новичок в С++.
У меня есть класс вроде этого:

class CodeTest
{
private:
    static const int TOTAL=100;
};

Является ли TOTAL декларацией или определением?

Когда я читал книгу Скотта Мейера, было упомянуто, что в файле реализации нам нужно определить что-то вроде:

const int CodeTest::TOTAL;

Зачем это требуется?

4b9b3361

Ответ 1

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

Это нарушит Одно правило определения. Последствием может быть, например, что если переменная была изменена в одной единицы перевода, это изменение было бы невидимым для других единиц перевода. Теперь это не так важно, поскольку переменная является постоянной. Однако, взяв его адрес, вы также получите разные указатели в разных единицах перевода.

Ответ 2

Поскольку это вызвало некоторые разногласия, я посмотрел в стандарте, а @Наваз прав, я был неправ.

9.4.2/2

Если элемент данных static имеет тип const const [...]. Участник все еще должны быть определены в области пространства имен, если они используются в программа и определение области пространства имен не должны содержать инициализатор.

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

Часть с интегральным типом const применяется только к этому конкретному случаю - то есть вы можете инициализировать указанный тип внутри класса, но все члены static данных должны быть определены вне.

Чтобы ответить на вопрос:

Независимо от того, требуется или не требуется определение вне класса (в зависимости от того, используете ли вы этот элемент или нет), все, что находится внутри класса (инициализировано или нет) - это просто объявление.

Ответ 3

Первая часть вопроса:

Эта строка: static const int TOTAL=100; - это объявление, за которым следует инициализация.

TOTAL является идентификатором.

Вторая часть вопроса

const int CodeTest::TOTAL требуется инициализировать переменную.

Ответ 4

static const int TOTAL=100; // is a declaration followed by an initialisation.

Из стандартного раздела С++ 3.1:

Объявление вводит имена в единицы перевода или имена переодеваний, введенные предыдущими объявлениями. Объявление определяет интерпретацию и атрибуты этих имен.

В следующем параграфе указано, что объявление является определением, если...... оно не объявляет статический член в определении класса:

struct X
{
    int a;         // defines a
    static int b;  // declares b
};

Подробнее об определении и декларации вы можете прочитать здесь: SO: В чем разница между определением и декларацией?