Я считаю, что что-то неинициализированное автоматически инициализируется и что это несколько опасно (и плохая практика). Я также понимаю, что списки инициализации, как правило, более эффективны (и в некоторых случаях необходимы), однако я хотел проверить некоторые параметры с помощью вызова функции, прежде чем назначать их переменной-члену.Должен ли я инициализировать все в конструкторе?
Например, используя типичный конструктор присваивания, я бы что-то вроде этого:
class MyObj
{
private:
int one_;
int two_;
DiffObj diffObj_;
... // other stuff
}
MyObj::MyObj(int a, int b, std::string type, std::vector<double> params)
{
one_ = a;
two_ = b;
if (verifyType(type, params))
{
diffObj_ = createDiffObj(params);
}
}
с этой ситуацией, хотя, как я мог бы использовать список инициализации? Я думал, возможно, инициализируя некоторые параметры в конструкторе и используя отдельный вызов для инициализации остальных, но я не совсем уверен, что это кошерный.
MyObj::MyObj(int a, int b) :
one_(a),
two_(b)
{}
MyObj::initializeDiffObj(std::string type, std::vector<double> params)
{
if (verifyType(type, params))
{
diffObj_ = createDiffObj(params);
}
}
Не обязательно указывать инициализацию для чего-либо. Как вы говорите, если вы не укажете, то члены будут построены по умолчанию, что во многих случаях просто отлично. Вы можете инициализировать некоторые элементы в списке инициализаторов, а остальные - в теле конструктора, вызывая функцию-член во втором блоке кода, если хотите. – Chris
«Я знаю, что ...» всегда, кажется, следует ложное утверждение –
@ M.M: «Я думал, что ...», возможно, было лучше сказано – marcman