Список инициализации конструктора C++:зачем и как его использовать
При создании экземпляров объектов конструкторы часто обрабатывают инициализацию переменных-членов. Для таких членов список инициализации конструкторов обеспечивает сокращенный и эффективный способ их инициализации перед выполнением тела конструктора. Помимо производительности, иногда это также необходимо из-за константных переменных или членов базового класса.
Что такое список инициализации конструктора?
Список инициализации конструктора — это процедура для непосредственной инициализации переменных-членов, поэтому конструктор по умолчанию не копируется, а затем назначается.
Синтаксис
Следующий синтаксис инициализации списка конструкторов следующий:
ClassName(type1 param1, type2 param2) : member1(param1), member2(param2) {
// Constructor body
}
Здесь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