Да, в результате порождаются объекты ABEntry со значениями, которых вы ожидаете, но это все же не лучший подход. Правила C++ оговаривают, что члены объекта инициируются
ABEntry(const std::string& name, const std::string& address,
const std::list
:theName(name), // теперь это все –
:theAddress(address),
thePhones(phones),
:numTimesConsulted(0)
{} // тело конструктора теперь пустоЭтот конструктор дает тот же самый конечный результат, что и предыдущий, но часто оказывается более эффективным. Версия, основанная на присваиваниях, сначала вызывает конструкторы по умолчанию для инициализации theName, theAddress и thePhones, а затем сразу присваивает им новые значения, затирая те, что уже были присвоены в конструкторах по умолчанию. Таким образом, вся работа конструкторов по умолчанию тратится впустую. Подход со списком инициализации членов позволяет избежать этой проблемы, поскольку аргументы в списке инициализации используются в качестве аргументов конструкторов для различных членов-данных. В этом случае theName создается конструктором копирования из name, theAddress – из address, thePhones – из phones. Для большинства типов единственный вызов конструктора копирования более эффективен – иногда
ABEntry()
:theName(), // вызвать конструктор по умолчанию для theName
:theAddress(), // сделать то же для theAddress и для thePhones;
thePhones(), // но явно инициализировать нулем numTimesConsulted
:numTimesConsulted(0)
{}