Два приведенных фрагмента кода: не совсем одинаково.
class Something
{
int m_a = 0;
};
Здесь указывается значение, с которым инициализацию, т.е. 0
, во время компиляции.
class Something
{
int m_a;
Something(int p_a);
};
Something::Something(int p_a):m_a(p_a){ ... };
И здесь вы делаете это на время выполнения (или, возможно, во время выполнения), со значением p_a
не известно, пока конструктор не вызывается.
Следующий фрагмент кода приходит ближе к первому примеру:
class Something
{
int m_a;
Something();
};
Something::Something() : m_a(0) { /* ... */ };
То, что вы должны рассмотреть здесь является то, что в первом случае, значение отображается непосредственно в определении класса. Это может создать ненужную зависимость. Что произойдет, если вам понадобится изменить 0
на 1
позже?Отображение значения непосредственно в определении класса (и, как правило, в заголовочном файле) может привести к перекомпиляции большого количества кода в ситуациях, когда другая форма инициализации позволит избежать этого, поскольку часть Something::Something() : m_a(0)
будет аккуратно инкапсулирована в источник файл и не появляется в файле заголовок:
// Something.h - stable header file, never changed
class Something
{
int m_a;
Something();
};
// Something.cpp - can change easily
Something::Something() : m_a(0) { /* ... */ };
конечно, преимущество в классе инициализации может значительно перевешивает этот недостаток. Это зависит. Вы просто должны помнить об этом.
первого один является новой особенностью C++ 11 – Emadpres
Я не ожидал, что первый код для работы. (edit: ok он делает сейчас) – Aitch
Возможный дубликат [C++ 11 допускает инициализацию нестатического и неконстантного элементов в классе. Что изменилось?] (Http://stackoverflow.com/questions/13662441/c11-allows-in-class-initialization-of-non-static-and-non-const-members-what-c) –