Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекции 1-2.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
142.98 Кб
Скачать

Конструкторы по умолчанию

Конструктор, который не имеет параметров (или содержит параметры, которые все имеют значения по умолчанию), называется конструктором по умолчанию.

Он вызывается, если пользователем не указаны значения для инициализации. Например:

#include <iostream>

class Fraction {

private:

int m_numerator;

int m_denominator;

public:

Fraction () // конструктор по умолчанию

{

m_numerator = 0;

m_denominator = 1;

}

int getNumerator () {return m_numerator;}

int getDenominator () {return m_denominator;}

double getValue () {return static_cast<double>(m_numerator) / m_denominator;}

};

int main () {

Fraction drob; // так как нет никаких аргументов, то вызывается

// конструктор по умолчанию Fraction ()

std::cout << drob.getNumerator() << "/" << drob.getDenominator() << '\n';

return 0;

}

Этот класс содержит дробь в виде отдельных значений типа int.

Конструктор по умолчанию называется Fraction (как и класс).

Поскольку мы создали объект класса Fraction без аргументов, то конструктор по умолчанию сработал сразу же после выделения памяти для объекта, и инициализировал наш объект.

Результат выполнения программы:

0/1

Обратите внимание, наш числитель (m_numerator) и знаменатель (m_denominator) были инициализированы значениями, которые мы задали в конструкторе по умолчанию!

Это настолько полезная особенность, что почти каждый класс имеет свой конструктор по умолчанию.

Без него значениями нашего числителя и знаменателя был бы мусор до тех пор, пока мы явно не присвоили бы им нормальные значения.

Конструкторы с параметрами

Хотя конструктор по умолчанию отлично подходит для обеспечения инициализации наших классов значениями по умолчанию, часто может быть нужно, чтобы экземпляры нашего класса имели определенные значения, которые могли бы быть разными для разных объектов.

Поэтому конструкторы также могут быть объявлены с параметрами.

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

#include <cassert>

class Fraction {

private:

Int m_numerator;

Int m_denominator;

public:

Fraction () { // конструктор по умолчанию

m_numerator = 0;

m_denominator = 1;

}

// Конструктор с двумя параметрами, один из которых имеет значение

//по умолчанию

Fraction (int numerator, int denominator=1) {

assert (denominator != 0);

m_numerator = numerator;

m_denominator = denominator;

}

Int getNumerator () {return m_numerator; }

Int getDenominator () {return m_denominator; }

double getValue () {return static_cast<double>(m_numerator) / m_denominator; }

};

В контексте программирования на C/C++ вызов функции assert() означает, что условие в параметре обязательно верно, и если это не так, то дальнейшее выполнение программы невозможно.

Таким образом, assert прервет нормальную работу программы (иногда с выводом сообщения), если условие, которое проверяет assert, равно false.

Обратите внимание, теперь у нас есть два конструктора: конструктор по умолчанию, который будет вызываться, если мы не предоставим значения, и конструктор с параметрами, который будет вызываться, если мы предоставим значения.

Эти два конструктора могут мирно сосуществовать в одном классе благодаря перегрузке функций.

Фактически, вы можете определить любое количество конструкторов до тех пор, пока у них будут уникальные параметры.

Как использовать конструктор с параметрами? Всё просто! Прямая инициализация:

int a (7); // прямая инициализация

Fraction drob (4, 5); // инициализируем напрямую, вызывается

// конструктор Fraction (int, int)

Здесь мы инициализировали нашу дробь числами 4 и 5, результат: 4/5.

В C++11 можно использовать uniform-инициализацию:

int a { 7 }; // uniform-инициализация

Fraction drob {4, 5}; // uniform-инициализация, вызывается конструктор

//Fraction (int, int)

Мы также можем указать только один параметр для конструктора с параметрами, а второе значение будет значением по умолчанию:

Fraction seven (7); // вызывается конструктор Fraction (int, int),

//второй параметр использует значение по умолчанию

Значения по умолчанию для конструкторов работают точно так же, как и для любой другой функции, поэтому в вышеприведенном примере, когда мы вызываем seven (7) , вызывается Fraction(int, int), второй параметр которого равен 1 (значение по умолчанию).

Правило: Используйте прямую инициализацию или uniform-инициализацию с объектами ваших классов.