2016-01-12 3 views
-1

Я прочитал, что конструкторы могут инициализировать только нестационарный атрибут. Я написал небольшой код, чтобы проверить это, и мне интересно теперь, потому что компилятор dosnt показывает какую-либо ошибку ??? Могу ли я инициализировать статический атрибут и нестатический атрибут в конструкторе или нет? это мой код! Большое спасибо!Как инициализировать статический атрибут в C++?

class NixIs { 
    int var; 
    static int global; 
public: 
    NixIs(int val = 0) 
    { 
     global = val; 
    } 

ответ

3

Я думаю, что вы имеете в виду «поле» вместо «attribute»

Ваш код действителен C++, но это не инициализировать статическое поле global, а что это конструктор экземпляра.

Если вы хотите инициализировать NixIs::global с тривиальным постоянным значением (известный во время компиляции) вы можете указать его инлайн в заголовке:

NixIs.h:

class NixIs { 
    static int global = 0; 
} 

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

NixIs.h:

class NixIs { 
    static int global; 
} 

NixIs.cpp:

int NixIs::global = nonTrivialValue; 

Если вы хотите инициализировать несколько статических полей в определенном порядке или с помощью значений функции-результата, вам нужно будет использовать хак, потому что C++ не имеет статических конструкторов. См. Здесь: Static constructor in c++

+3

Вы можете использовать 'static int global = 0;' только для членов 'const', т. Е.' Static int const global = 0; '. –

+1

Определяя в заголовках, вы можете получить количество копий значения в двоичных файлах, что может быть или не быть тем, что вы хотите. – Jason

+0

Если вы хотите инициализировать несколько статических полей в определенном порядке, просто поместите определения в один файл cpp в этом порядке *. * Технически есть несколько проходов при инициализации, но эффективно, только это. –

0

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

NixIs(int init_val) : val(init_val) { 
    // do stuff 
} 

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

NixIs first(1); // first.global is now 1 
NixIs second(2); // first.global is now also 2 (same as second.global) 
Смежные вопросы