0Pricing
C++ Academy · Урок

Конструкторы и списки инициализации членов

Корректно инициализируйте члены с помощью списков инициализации членов.

«Конструкторы и списки инициализации членов» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Что такое конструктор

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

class Point {
public:
    Point() {              // default constructor
        x_ = 0;
        y_ = 0;
    }
private:
    int x_, y_;
};

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

Конструкторы могут принимать параметры, и у класса может быть несколько перегрузок.

class Point {
    int x_, y_;
public:
    Point() : x_(0), y_(0) {}
    Point(int x, int y) : x_(x), y_(y) {}
};

Списки инициализации членов

Синтаксис : member(value) перед телом — это список инициализации членов. Здесь члены инициализируются, а не присваиваются позже внутри тела.

class Person {
    std::string name_;
    int age_;
public:
    Person(std::string n, int a) : name_(std::move(n)), age_(a) {}
};

Зачем нужны списки инициализации

Члены создаются ровно один раз сразу с нужными значениями. Без списка они сначала создаются со значениями по умолчанию, а затем им присваиваются значения — это неэффективно для нетривиальных типов.

Порядок инициализации

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

Инициализаторы по умолчанию внутри класса (C++11)

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

class Buffer {
    size_t size_ = 0;
    char* data_ = nullptr;
public:
    Buffer() = default;
    Buffer(size_t n) : size_(n), data_(new char[n]) {}
};

= default и = delete

Попросите компилятор предоставить или удалить специальный член:

class Widget {
public:
    Widget() = default;          // compiler-generated default
    Widget(const Widget&) = delete;  // disable copy
};

Делегирующие конструкторы (C++11)

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

class Box {
    int w_, h_, d_;
public:
    Box(int w, int h, int d) : w_(w), h_(h), d_(d) {}
    Box() : Box(1, 1, 1) {}      // delegates to the 3-arg ctor
};

Явные конструкторы

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

class Vector {
public:
    explicit Vector(size_t n);
};
Vector v = 10;          // ERROR: explicit prevents this
Vector v(10);            // OK

Деструкторы

Деструктор ~ClassName() выполняется при уничтожении объекта. Используйте его для освобождения ресурсов (файлов, сокетов, сырой памяти).

Правило пяти (предварительный обзор)

Если вы определяете любую из специальных функций-членов (деструктор, конструктор копирования, оператор копирующего присваивания, конструктор перемещения, оператор перемещающего присваивания), подумайте обо всех пяти. Это рассматривается в курсе по семантике перемещения.

Быстрая проверка

Что определяет порядок инициализации членов класса?

Итоги

Используйте конструкторы для задания состояния объекта. Предпочитайте списки инициализации членов присваиваниям в теле. Помечайте конструкторы с одним аргументом как explicit, а с помощью = default и = delete явно выражайте намерение.

Часто задаваемые вопросы

Урок «Конструкторы и списки инициализации членов» бесплатный?

Да — полный текст урока «Конструкторы и списки инициализации членов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Конструкторы и списки инициализации членов»?

Корректно инициализируйте члены с помощью списков инициализации членов. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Конструкторы и списки инициализации членов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. struct и class: когда что использовать
  2. Переменные-члены и методы
  3. Конструкторы и списки инициализации членов
  4. Указатель this и инкапсуляция
← Назад к C++ Academy