ru en
.. ....... НовостиNews - ТекстыTexts - ФотоPhotos - КартыMaps - СнаряжениеEquipment - ПоходыTravel catalog - Старые новости (ЖЖ)Old news (LJ)

Ловушка на C++
2010-10-20

В.Завьялов

Какие из классов B1, B2, B3 определены неправильно?


#include <iostream>

struct A{
  int val;
  A(int v): val(v){}
};

struct B1{
  A a1,a2;
  B1(): a1(4), a2(a1.val){}
};

struct B2{
  A a1,a2;
  B2(): a2(a1.val), a1(4){}
};

struct B3{
  A a2,a1;
  B3(): a1(4), a2(a1.val){}
};

main(){
  B1 b1;
  B2 b2;
  B3 b3;
  std::cerr << b1.a2.val << "\n"
            << b2.a2.val << "\n"
            << b3.a2.val << "\n";
}

забавно, что такими играми можно случайно получить доступ к объекту до выполнения его конструктора, а компилятор (gcc-4.4.3) ничего не заметит...

realtim: такой порядок инициализации членов объясняется тем, что конструкторов может быть несколько и у них будет разный порядок инициализаторов членов; а так как общий принцип -- разрушать всё в обратном порядке, то инициализация происходит в порядке описания. Странно, что при этом можно в списке инициализаторов использовать члены класса для вычисления значений.