Список инициализации конструктора C++: зачем и как его использовать
При создании объектов конструкторы часто обрабатывают инициализацию переменных-членов. Для таких членов список инициализации конструктора предоставляет сокращенный и эффективный способ их инициализации до выполнения тела конструктора. Помимо производительности, иногда это обязательно из-за константных переменных или членов базового класса.
Что такое список инициализации конструктора?
Список инициализации конструктора — это процедура инициализации переменных-членов напрямую, поэтому нет конструктора по умолчанию, который копируется, а затем присваивается.
Синтаксис
Следующий синтаксис инициализации списка конструктора выглядит так:
ClassName(type1 param1, type2 param2) : member1(param1), member2(param2) {
// Тело конструктора
}
Здесь member1 и member2 инициализируются с param1 и param2 до запуска тела конструктора.
Пример списка инициализации конструктора
Вот простой пример демонстрации использования списка инициализации.
#include <iostream>
#include <string>
class Student {
public:
Student(const std::string& name, int age) : name(name), age(age) {}
void display() const {
std::cout << "Name: " << name << ", Age: " << age << "\n";
}
private:
std::string name;
int age;
};
int main() {
Student s("Navya", 20);
s.display();
return 0;
}
Вывод
Name: Navya, Age: 20
Зачем использовать списки инициализации конструктора?
- Чтобы избежать инициализации по умолчанию, за которой следует переприсваивание, экономя время и ресурсы.
- Это обязательно для определенных типов константных переменных, ссылочных членов и членов базового класса.
- Это держит всю логику инициализации в одном месте, отдельно от тела конструктора.
Особые случаи
В следующем мы обсудим несколько особых случаев для списка инициализации конструктора:
Константные или ссылочные члены
Константные переменные и ссылочные члены не могут быть переприсвоены, поэтому они должны быть инициализированы в списке инициализации,
class Config {
public:
Config(const std::string& product, const int & model) : product(product), model(model) {}
private:
const std::string product;
const int & model;
};
Инициализация базового класса
Когда производный класс наследуется от базового класса, вы можете использовать список инициализации для вызова конструктора базового класса,
class Base {
public:
Base(int value) : baseValue(value) {}
protected:
int baseValue;
};
class Derived : public Base {
public:
Derived(int value, int extra) : Base(value), extraValue(extra) {}
private:
int extraValue;
};
Язык C
- Базовый синтаксис C: токены, идентификаторы, ключевые слова и пробелы
- Освоение многопоточности в C++: эффективное параллельное программирование
- Освоение структур в C: определение, переменные, доступ и продвинутые примеры
- Мастерство многомерных массивов в C: 2D и 3D массивы подробно
- Установка Visual Studio 2019 Community Edition для C#-разработки на Windows
- Интерфейсы в C#: контракты для надежного ООП
- Освоение указателей на символы и работы с функциями в языке C
- Динамическая память в C++: стек против кучи
- Четыре проверенных паттерна пользовательских функций в C
- Изучение C программирования: полное PDF-руководство для начинающих