B b0(0);
- такого конструктора для B нет, поэтому компилятор ищет какой-то конструктор, который можно вызвать только одним приведением (одно неявное приведение разрешено, 2 - нет), поэтому он находит B::B(const A& a)
,потому что A
имеет конструктор только с одним параметром, а это A::A(int i)
.Это означает, что 0 можно привести к int
, поэтому временный объект A
создается (и уничтожается после создания B).Итак, вот почему у нас есть
A::A(0)
B::B(const A& a)
A::~A()
Тогда следующее называется: B b1("abc");
, вот так:
A::A(abc)
B::B(const A& a)
A::~A()
Это абсолютно то же самое, что и с int
, ноздесь с char*
.
Затем оба объекта разрушаются, поэтому их деструкторы вызываются в обратном порядке, как и их конструкторы, вот откуда
B::~B()
A::~A()
B::~B()
A::~A()
.1021 *
Выглядит заманчиво, потому что вы не перегружены A::A( const A& a)
и не видите, что он тоже вызывается 2 раза.
Приветствия (:
Небольшое редактирование: не A::A()
, а A::A( const A& a)
- благодаря Ним.