Нет необходимости делать это на самом деле.
Конструктор по умолчанию сделает это автоматически.
Но иногда, делая это явным, он действует как документация:
class X
{
std::map<string,string> data;
Y somePropertyOfdata;
X()
:data() // Technically not needed
,somePropertyOfdata(data) // But it documents that data is finished construction
{} // before it is used here.
};
Правило в C ++ состоит в том, что если вы явно не инициализируете данные POD, они не определены, в то время как в других классах конструктор по умолчанию вызывается автоматически (даже если программист не сделал этого явно).
Но, сказав это. Учтите это:
template<typename T>
class Z
{
T data;
Z()
:data() // Technicall not need as default constructor will
// always be called for classes.
// But doing this will initialize POD data correctly
// if T is a basic POD type.
{}
};
Здесь вы ожидаете, что данные будут инициализированы по умолчанию.
Технически POD не имеет конструкторов, так что если бы T был int, тогда вы ожидаете, что он что-нибудь сделает? Поскольку он был явно инициализирован, для него установлено значение 0 или эквивалент для типов POD.
Для редактирования:
class A
{
std::map<string,string> m_someMap;
int m_someint;
bool m_somebool;
public:
A::A()
: m_someMap() // Class will always be initialised (so optional)
, m_someint(0) // without this POD will be undefined
, m_somebool(false)// without this POD will be undefined
{}
};