Недавно возникла проблема, что программа не работала при инициализации через :v_(v), а при обычном сработало, но разобраться, в чем проблема, я, к сожалению, так и не смог. Так что хочу спросить здесь, чем отличается такая инициализация переменных в конструкторе
template<typename Iterator>
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<typename Iterator>
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 <typename T>
class widget
{
public:
widget(const T& value)
{
value_ = value;
}
private:
T value_;
};
value_ = value;
- это не иницализация, а присваивание. Сначала будет вызван конструктор по умолчанию без параметров (если таковой имеется), затем будет вызвана операция копирующего присваивания (если таковая имеется).
widget(const T& value) :
value_(value)
{
}
В таком варианте, будет вызван конструктор копирования. Используется именно такой вариант, т.к. фактически он выполнится быстрее из-за меньших затрат. Существуют случаи когда списковая инициализация членов класса необходима: например инициализация константного нестатического члена (присваивание в этом случае не подойтет).
Больше тут
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я не могу понять почему компилятор выдает мне ошибку Ошибка C4700 использована неинициализированная локальная переменная "TempNode"Вот мой код: