Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Инициализация обычная и через :v_(v)

#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



При входе в тело конструктора все члены-данные класса должны быть инициализированы. Когда вы пишите: template class widget { public: widget(const T& value) { value_ = value; } private: T value_; }; value_ = value; - это не иницализация, а присваивание. Сначала будет вызван конструктор по умолчанию без параметров (если таковой имеется), затем будет вызвана операция копирующего присваивания (если таковая имеется). widget(const T& value) : value_(value) { } В таком варианте, будет вызван конструктор копирования. Используется именно такой вариант, т.к. фактически он выполнится быстрее из-за меньших затрат. Существуют случаи когда списковая инициализация членов класса необходима: например инициализация константного нестатического члена (присваивание в этом случае не подойтет). Больше тут

Комментариев нет:

Отправить комментарий