Базовый / конструктор по умолчанию против списка инициализации конструктора - PullRequest
0 голосов
/ 07 февраля 2019

Я прочитал несколько разных тем на этих форумах и не получил четкого ответа на них.

У меня два вопроса, в чем разница между конструкцией по умолчанию / base и списком инициализации конструкции?Они выглядят одинаково для меня, вот мои примеры.Я правильно прокомментировал их, а также то, что они есть?

//In my .h file:
class Complex {

public:
Complex();
Complex(double, double);
private:
double real;
double imag;
};

//In my implementation file:
Complex::Complex() :real(NULL), imag(NULL) // initialization list
{
}

Complex::Complex(double inReal, double inImag) // default constructor
{
real = inReal;
imag = inImag;
}    

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

У меня два вопроса, в чем разница между конструкцией по умолчанию / 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)
{ }

Этот единственный конструктор может разумно заменить оба конструктора в вашем коде.

0 голосов
/ 07 февраля 2019

В этом случае

Complex::Complex() : real(NULL), imag(NULL)
{
}

будет вашим конструктором по умолчанию , потому что здесь нет параметров.

Инициализатор list - это то, что вы видите после имени вашего конструктора по умолчанию:

:real(NULL), imag(NULL)

Это список инициализаций членов, которые происходят при вызове конструктора по умолчанию Complex::Complex()

Кроме того, NULL - это значение, предназначенное для представления указателя, который не указывает на какое-либо допустимое адресуемое место в памяти.Это не совсем применимо к double типам.

...