#cpp
Недавно возникла проблема, что программа не работала при инициализации через :v_(v), а при обычном сработало, но разобраться, в чем проблема, я, к сожалению, так и не смог. Так что хочу спросить здесь, чем отличается такая инициализация переменных в конструкторе templateclass Paginator { public: Paginator(Iterator begin, Iterator end, size_t page_size) : begin_(begin), end_(end), page(page_size) { } private: Iterator begin_, end_; size_t page; }; От такой: template class Paginator { public: Paginator(Iterator begin, Iterator end, size_t page_size){ begin_ = begin; end_ = end; page = page_size; } private: Iterator begin_, end_; size_t page; };
Ответы
Ответ 1
При входе в тело конструктора все члены-данные класса должны быть инициализированы. Когда вы пишите: templateclass widget { public: widget(const T& value) { value_ = value; } private: T value_; }; value_ = value; - это не иницализация, а присваивание. Сначала будет вызван конструктор по умолчанию без параметров (если таковой имеется), затем будет вызвана операция копирующего присваивания (если таковая имеется). widget(const T& value) : value_(value) { } В таком варианте, будет вызван конструктор копирования. Используется именно такой вариант, т.к. фактически он выполнится быстрее из-за меньших затрат. Существуют случаи когда списковая инициализация членов класса необходима: например инициализация константного нестатического члена (присваивание в этом случае не подойтет). Больше тут
Комментариев нет:
Отправить комментарий