2010-04-27 2 views
0

Я изучаю C++. Просто любопытно, могут ли только статические и постоянные переменные присваиваться значение из декларации класса? Именно поэтому, когда вы назначаете значения нормальным членам, у них есть особый способ сделать этоТолько статические и константные переменные могут быть назначены классу?

void myClass::Init() : member1(0), member2(1) 
{ 
} 

ответ

5

Похоже, что это должен быть конструктор; если это так, то не должно быть никакой тип возвращения, и он должен иметь такое же имя, как класс, например,

myClass::myClass() 
    : member1(0), member2(1) 
{ 

} 

Только конструктор может иметь список инициализатора; вы не можете делегировать этот тип инициализации функции Init.

Любые нестатические элементы могут быть инициализированы в списке инициализаторов конструктора. Все константные и ссылочные элементы должны быть инициализированы в списке инициализаторов конструктора.

Все, что равняется you should generally prefer to initialize all members in the constructor initializer list, а не в теле конструктора (иногда это невозможно или неудобно использовать список инициализаторов, и в этом случае вы не должны использовать его, очевидно).

+0

ok, это имеет смысл. Но ранее я получал ошибки, заявляя, что в класс могут быть объявлены только статические константные члены. Означает ли это, что только статические и постоянные члены могут быть назначены значения из декларации класса, в противопоставлении списку инициализатора или телу конструктора. – numerical25

+1

В объявлении класса могут быть инициализированы только статические интегральные элементы. Любые нецелые члены должны быть инициализированы извне из объявления класса. (т. е. вы не можете инициализировать статический float в объявлении, но вы можете использовать int, short, char или bool). –

0

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

Теперь возникает вопрос, почему только статические члены const могут быть инициализированы в самом классе. Причина в том, что класс, скорее всего, находится в заголовке, и этот заголовок включен в несколько единиц перевода. Это создает проблему для компилятора. В какой части перевода (т. Е. В каком объектном файле) должна быть установлена ​​фактическая инициализация? Но для простых констант это не имеет значения. int const TWO = 2; не нуждается в фактической инициализации в блоке перевода, компилятор просто помнит об этом.

Смежные вопросы