Конструкторы и списки инициализации членов
Корректно инициализируйте члены с помощью списков инициализации членов.
«Конструкторы и списки инициализации членов» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- struct и class: когда что использовать
- Переменные-члены и методы
- Конструкторы и списки инициализации членов
- Указатель this и инкапсуляция