Еще один вопрос из чтения «Ускоренный C++» Эндрю Кенига и Барбары Э. Му, и я нахожусь в главе о конструкторах (5.1), используя пример как before.Инициализация конструктора с аргументами
Они пишут
мы хотим определить два конструктора: первый конструктор не принимает никаких аргументов и создает пустой
Student_info
объект; вторая берет ссылку на входной поток и инициализирует объект, читая студенческую запись из этого потока.
ведет к примеру с помощью Student_info::Student_info(istream& is) {read(is);}
в качестве второго конструктора, который
Делегаты реальной работы к функции считывания. [...] чтение немедленно дает этим переменным новые значения.
Student_info
класс
class Student_info {
public:
std::string name() const (return n;}
bool valid() const {return !homework.empty();}
std::istream& read(std::istream&);
double grade() const;
private:
std::string n;
double midterm, final;
std::vector<double> homework;
};
read
Поскольку уже определен как функция под Student_info
класса, почему существует необходимость использовать второй конструктор - не такая двойная работа? Почему бы просто не использовать конструктор по умолчанию, а затем функцию, так как оба уже определены?
Так что сохраняет шаг инициализации всех переменных в (их версии нуля) непосредственно перед ним записывается? Есть ли разница в скорости/мощности, или это просто для ясности? – sccs
@sccs переменные сначала инициализируются, потому что функция вызывается из тела конструктора. На этом этапе все элементы данных были построены. Поэтому настоящая причина - это тот аспект дизайна, который я упомянул в последнем абзаце. Это не просто ясность: тип, который должен быть явно инициализирован после того, как строительство довольно бесполезно (хотя я сталкиваюсь с ними каждый день на работе) – juanchopanza
Я только что увидел это, спасибо! Еще один - существуют ли когда-либо программы, в которых нет такого второго конструктора (с аргументами)? – sccs