Список инициализации
Список инициализации - это специальный синтаксис конструктора,
который позволяет инициализировать поля класса и базовые классы
до выполнения тела конструктора. Он записывается после списка
параметров конструктора через двоеточие. В списке инициализации
каждое поле указывается через запятую в формате
поле(значение). Такой способ инициализации часто
эффективнее присваивания в теле конструктора, а для константных
полей и ссылок - единственно возможный.
Синтаксис
ClassName(params) : field1(value1), field2(value2), baseClass(args)
{
// тело конструктора
}
Пример
Давайте создадим класс Point с двумя полями и
инициализируем их через список инициализации:
#include <iostream>
using namespace std;
class Point
{
private:
int x;
int y;
public:
Point(int x, int y) : x(x), y(y)
{
}
void print()
{
cout << x << " " << y << endl;
}
};
int main()
{
Point p(1, 2);
p.print();
return 0;
}
Результат выполнения кода:
1 2
Пример
Список инициализации обязателен для константных полей и полей-ссылок. Давайте создадим класс с константным полем и ссылкой:
#include <iostream>
using namespace std;
class Holder
{
private:
const int id;
int& ref;
public:
Holder(int id, int& ref) : id(id), ref(ref)
{
}
void print()
{
cout << id << " " << ref << endl;
}
};
int main()
{
int value = 42;
Holder h(7, value);
h.print();
return 0;
}
Результат выполнения кода:
7 42
Пример
Порядок инициализации полей определяется порядком их объявления в классе, а не порядком в списке инициализации. Давайте убедимся в этом:
#include <iostream>
using namespace std;
class Order
{
private:
int a;
int b;
public:
Order(int val) : b(val), a(b + 1)
{
}
void print()
{
cout << a << " " << b << endl;
}
};
int main()
{
Order o(5);
o.print();
return 0;
}
Результат выполнения кода:
6 5
Смотрите также
-
ключевое слово
ctor-init,
которое описывает список инициализации конструктора -
конструктор
constructor,
который создает объект класса -
делегирующий конструктор
delegating-ctor,
который вызывает другой конструктор того же класса -
ключевое слово
explicit,
которое запрещает неявные преобразования