#cpp
Недавно возникла проблема, что программа не работала при инициализации через :v_(v),
а при обычном сработало, но разобраться, в чем проблема, я, к сожалению, так и не смог.
Так что хочу спросить здесь, чем отличается такая инициализация переменных в конструкторе
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;
};
От такой:
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) { } В таком варианте, будет вызван конструктор копирования. Используется именно такой вариант, т.к. фактически он выполнится быстрее из-за меньших затрат. Существуют случаи когда списковая инициализация членов класса необходима: например инициализация константного нестатического члена (присваивание в этом случае не подойтет). Больше тут
Комментариев нет:
Отправить комментарий