W C++ kolejność inicjalizacji członków klasy odbywa się zawsze w takiej kolejności, w jakiej są zadeklarowane w ciele klasy, a nie w takiej, w jakiej zostały wskazane w liście inicjalizacji konstruktora.
Przykład:
struct Foo { int a; int b; Foo() : b(2), a(b) {} };
W tym przykładzie najpierw będzie zainicjalizowane a wartością nieokreślonej zmiennej b, ponieważ najpierw inicjalizuje się a, a potem b, niezależnie od kolejności w liście inicjalizacji. W rezultacie a nie będzie równe 2.
Prawidłowy sposób: podczas inicjalizacji odnosić się tylko do wcześniej zadeklarowanych członków lub używać stałych.
W jakiej kolejności będą zainicjalizowane członkowie klasy, jeśli w liście inicjalizacji konstruktora kolejność ich inicjalizacji jest inna niż w deklaracji?
Odpowiedź: Zawsze najpierw inicjalizowany jest ten członek, który został najpierw zadeklarowany w klasie, niezależnie od kolejności w liście inicjalizacji konstruktora. Może to prowadzić do błędów w przypadku wzajemnej zależności członków klasy.
Historia
W skomplikowanej klasie, podczas inicjalizacji referencji do członka klasy, inny członek nie był zainicjalizowany. Okazało się, że kolejność w liście inicjalizacji nie ma znaczenia, co doprowadziło do użycia niezainicjalizowanej pamięci. Oprogramowanie zawieszało się tylko przy określonych kompilatorach i ustawieniach.
Historia
Podczas dodawania nowego członka w środku klasy bez poprawienia kolejności inicjalizacji zależnych członków wystąpił błąd, który został wykryty tylko podczas analizy statycznej kodu. Zmienna przyjmowała nieprawidłową wartość z powodu starej kolejności deklaracji.
Historia
Nowa wersja biblioteki zmieniła kod źródłowy klasy i zmieniła kolejność członków, nie zmieniając konstruktora. W rezultacie wartości w aplikacji działały z nieprawidłowymi danymi: inżynier długo nie mógł zrozumieć przyczyny, aż zobaczył ostrzeżenie kompilatora o kolejności inicjalizacji.