У меня два вопроса, в чем разница между конструкцией по умолчанию / base и списком инициализации конструкции?
A конструктор по умолчанию - это конструктор, который будетвызываться при создании объекта, но не указывать аргументы конструктора.Например, все эти переменные будут инициализированы вызовом конструктора по умолчанию:
Complex myComplex1;
Complex myComplex2();
Complex myComplex3{};
Некоторые другие конструкторы требуют аргументов, поэтому они не конструкторы по умолчанию.
В реализации любого конструктора (будь то конструктор по умолчанию или нет) для объекта с базами или переменными-членами иликонстанты, вы можете использовать список инициализации для создания / инициализации этих баз или членов.
Они выглядят одинаково для меня, вот мои примеры.Я правильно прокомментировал их, а также то, что они есть?
Вы не правильно прокомментировали их.Фиксированная версия:
Complex::Complex() // default constructor as it does not require args
: real{}, imag{} // initialization list: sets both to 0.0
{ }
Complex::Complex(double inReal, double inImag) // NOT a default constructor
// as it requires arguments
: real(inReal), imag(inImag) // initialisation list
{
// real = inReal; // set in the initialisation list instead
// imag = inImag;
}
Приведенный выше конструктор не по умолчанию вызывается при создании объекта с указанием соответствующих аргументов конструктора:
Complex myComplex4(3.1, 2);
Complex myComplex5{-2.3, 2.7};
Рекомендуется использовать преимущественносписок инициализации для создания ваших баз и установки ваших членов: в противном случае они будут инициализированы по умолчанию, а затем назначены, что может быть менее эффективным, но для ссылок и констант вы просто должны использовать список инициализации.
Можно создать конструктор по умолчанию с аргументами со значениями по умолчанию:
Complex(double inReal = 0.0, double inImag = 0.0)
: real(inReal), imag(inImag)
{ }
Этот единственный конструктор может разумно заменить оба конструктора в вашем коде.