Порядок инициализации элементов списка инициализации конструктора (
initializer list
) определяется порядком объявления членов класса, а не порядком, указанным в списке инициализации. Это важно понимать, так как неправильный порядок может привести к неожиданным ошибкам, особенно при инициализации зависимых членов.#include <iostream>
class MyClass {
private:
int a;
int b;
int c;
public:
MyClass(int x, int y, int z) : c(z), b(y), a(x) {
std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl;
}
};
int main() {
MyClass obj(1, 2, 3);
return 0;
}
В конструкторе
MyClass
список инициализации указан в порядке c(z), b(y), a(x)
. Однако это не влияет на порядок инициализации членов класса. Члены класса будут инициализированы в порядке их объявления: a
, затем b
, затем c
.a
инициализируется первым (значение x
).b
инициализируется вторым (значение y
).c
инициализируется третьим (значение z
).Программа выведет
a: 1, b: 2, c: 3
Неправильный порядок в списке инициализации не приведет к ошибке компиляции, но может вызвать логические ошибки, особенно если один член зависит от другого. Рассмотрим пример с зависимыми членами:
class MyClass {
private:
int a;
int& ref;
public:
MyClass(int x) : ref(a), a(x) { // Неправильный порядок: ref инициализируется до a
std::cout << "a: " << a << ", ref: " << ref << std::endl;
}
};
Ставь 👍 и забирай 📚 Базу знаний