请解释一下,下面的程序!多谢!

请解释一下,下面的程序!谢谢!!
#include   <iostream.h>
class   A
{
public:
A(   )   {   a=0;   cout < < "类A的缺省构造函数.\n ";   }
A(int   i)   {   a=i;   cout < < "类A的构造函数.\n ";   }
~A(   )   {   cout < < "类A的析构函数.\n ";   }
void   Print(   )   const   {   cout < <a < < ", ";   }
int   Geta(   )   {   return   a;   }
private:
int   a;
};
class   B   :   public   A
{
public:
B(   )   {   b=0;   cout < < "类B的缺省构造函数.\n ";   }
B(int   i,   int   j,   int   k);
~B(   )   {   cout < < "类B的析构函数.\n ";   }
void   Print(   );
private:
int   b;
A   aa;
};
B::B(int   i,   int   j,   int   k):A(i),   aa(j)
{
b=k;
cout < < "类B的构造函数.\n ";
}
void   B::Print(   )
{
A::Print(   );
cout < <b < < ", " < <aa.Geta(   ) < <endl;
}
void   main(   )
{
B   bb[2];
bb[0]   =   B(1,   2,   5);
bb[1]   =   B(3,   4,   7);
for(int   i=0;   i <2;   i++)
bb[i].Print(   );
}
程序运行结果是:
类A的缺省构造函数
类A的缺省构造函数
类B的缺省构造函数
类A的缺省构造函数
类A的缺省构造函数
类B的缺省构造函数
类A的构造函数
类A的构造函数
类B的构造函数
类B的析构函数         -------这些以横线标识的6行,怎么会在这里出现?
类A的析构函数         -------难道构造函数运行完,就直接运行析构函数?
类A的析构函数         -------但下面还用到了这些对象,为什么?
类A的构造函数
类A的构造函数
类B的构造函数
类B的析构函数         -------
类A的析构函数         -------
类A的析构函数         -------
1,5,2
3,7,4
类B的析构函数
类A的析构函数
类A的析构函数
类B的析构函数
类A的析构函数
类A的析构函数


------解决方案--------------------
因为中间创建了一些临时变量。
------解决方案--------------------
B bb[2];
bb[0] = B(1, 2, 5);
bb[1] = B(3, 4, 7);

先用缺省构造函数构造了两个bb
然后再创建两个临时变量 B(1, 2, 5)和B(3, 4, 7)
使用有参构造函数

之后通过系统的给的默认赋值函数将这两个变量赋值给bb[0] bb[1]