Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 18 из 104.

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

Если вы не определите ни одного конструктора, компилятор генерирует неявный конструктор по умолчанию, который ничего не делает для примитивных типов и вызывает конструкторы по умолчанию для объектов-членов.

class Player {
    int health;
    int score;
public:
    Player() {           // Конструктор по умолчанию
        health = 100;
        score = 0;
    }
};

Player p1;               // Вызывает конструктор по умолчанию
Player p2{};             // Также вызывает конструктор по умолчанию

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

class Enemy {
    int damage;
public:
    Enemy(int d) : damage(d) {}  // Только параметризованный конструктор
};

Enemy e1(10);    // Работает
Enemy e2;        // Ошибка! Нет конструктора по умолчанию

В современном C++ вы можете явно запросить генерируемый компилятором конструктор по умолчанию, используя = default:

class Item {
    int id;
public:
    Item() = default;           // Компилятор генерирует конструктор по умолчанию
    Item(int i) : id(i) {}
};

Конструкторы по умолчанию необходимы для создания массивов объектов и для классов, используемых в контейнерах, таких как std::vector, которым может потребоваться создание элементов без аргументов.

challenge icon

Задание

Легко

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

Вы создадите два файла для организации вашего кода:

  • Counter.h: Определите класс Counter, который отслеживает значение счетчика. Ваш класс должен иметь:
    • Приватный атрибут count (целое число)
    • Приватный атрибут name (строка) для идентификации счетчика
    • Конструктор по умолчанию, который инициализирует count значением 0 и name значением "Unnamed", а затем выводит "Counter created: <name>"
    • Метод increment(), который увеличивает счетчик на 1
    • Метод getCount(), который возвращает текущее значение счетчика
    • Метод getName(), который возвращает имя счетчика
  • main.cpp: Продемонстрируйте, что конструкторы по умолчанию работают при создании объектов различными способами. Считайте из входных данных число, указывающее, сколько раз нужно увеличить счетчик, затем:
    • Создайте Counter, используя прямую инициализацию: Counter c1;
    • Создайте еще один Counter, используя инициализацию в фигурных скобках: Counter c2{};
    • Увеличьте c1 количество раз, указанное во входных данных
    • Выведите "<name>: <count>" для c1
    • Выведите "<name>: <count>" для c2

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

Подключите ваш заголовочный файл в main.cpp с помощью #include "Counter.h".

Шпаргалка

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

class Player {
    int health;
    int score;
public:
    Player() {           // Default constructor
        health = 100;
        score = 0;
    }
};

Player p1;               // Calls default constructor
Player p2{};             // Also calls default constructor

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

class Enemy {
    int damage;
public:
    Enemy(int d) : damage(d) {}  // Parameterized constructor only
};

Enemy e1(10);    // Works
Enemy e2;        // Error! No default constructor

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

class Item {
    int id;
public:
    Item() = default;           // Compiler generates default constructor
    Item(int i) : id(i) {}
};

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

Попробуйте сами

#include <iostream>
#include "Counter.h"

using namespace std;

int main() {
    // Считать количество инкрементаций
    int n;
    cin >> n;

    // TODO: Создать Counter, используя прямую инициализацию: Counter c1;

    // TODO: Создать еще один Counter, используя инициализацию фигурными скобками: Counter c2{};

    // TODO: Увеличить c1 на число, указанное в n

    // TODO: Вывести "<name>: <count>" для c1

    // TODO: Вывести "<name>: <count>" для c2

    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование