Какими методами лучше инициализировать параметры класса. (Лист инициализации, move семантика, вызов конструктора через конструктор)
задался вопросом относительно того, что и когда правильнее использовать. Был бы благодарен если бы объяснили как работает нижеперечисленные фрагменты кода, которые я нашёл в просторах интернета и не слишком понимаю как они работают.
Предположим класс Node имеет два параметра Type value и Node *nextp.
Тут при создании объекта класса Node, вызывается конструктор класса, а передача значения происходит с помощью move семантики? В чём преимущество такой инициализации и какие у него недостатки?
template<typename Type>
inline Node<Type>::Node(Type v) : value(v), nextp(nullptr)
{
}
Тут при создании объекта класса Node, вызывается конструктор класса, а передача значения происходит с помощью списка/листа инициализации? Происходит ли инициализация параметров класса в динамической памяти (в heap) или же параметры остаются статичными? Как добиться в этом случае инициализации параметров в динамическую паять?
template<typename Type>
inline Node<Type>::Node(Type v) : value{v}, nextp{nullptr}
{
}
Таким же образом через конструктор Node наверное пытались вызывать некий другой конструктор, который вызывал бы инициализацию поля/параметра value. Является ли такой способ правильным?
template<typename Type>
inline Node<Type>::Node(Type v) : anc_constructor(v), nextp(nullptr)
{
}
Ответы (1 шт):
Спасибо, комментатору выше. Окончательный ответ был бы невозможным без него. Так вот. Как оказалось существенной разницы между () и {} скобкам в списке инициализаторов нет. Их единственное отличие в том, что при инициализации значений через {} скобки не происходит преобразования типа.
В то же время, попытки вызова конструктора предка невозможно целом (если не инициализировать или динамически выделять память для объекта класса предка в списке инициализаторов). Поэтому вышеперечисленные код или является ошибкой или нечто иным, чем просто вызов конструктора.