构造函数有关问题,

构造函数问题,请指教!
#include   "stdafx.h "
#include   <iostream>
#include   <conio.h>

using   namespace   std;

class   A
{
public:

A()
{
cout < < "A() " < <endl;
A(5);
};


A(int   val)
{
cout < < "A(int) " < <endl;
m_i=val;
};

void   Print()
{
cout < <m_i < <endl;
};

private:
int   m_i;

};


class   B
{
public:

B():m_a()
{
cout < < "B() " < <endl;
};

void   Print()
{
m_a.Print();
}

public:
A   m_a;


};


int   _tmain(int   argc,   _TCHAR*   argv[])
{
A   a1;
a1.Print();

B   b1;
b1.m_a.Print();
b1.Print();


getch();

return   0;
}

结果是
A()
A(int)
-858993460
A()
A(int)
B()
-858993460
-858993460

按输出显示初始化a1和b1都执行了A(),然后又执行了A(5),为何结果却不对!

而将类A改为这样却是对的:
class   A
{
public:

//A()
//{
// cout < < "A() " < <endl;
// A(5);
//};


A(int   val=5)
{
cout < < "A(int) " < <endl;
m_i=val;
};

void   Print()
{
cout < <m_i < <endl;
};

private:
int   m_i;

};

为何???
高手解释下

------解决方案--------------------
A()
{
cout < < "A() " < <endl;
A(5);这句你想干什么?呃,从java转过来的?竟然想直接调用其它构造函数。
};

用A():m_i(5){cout < < "A() " < <endl;};
------解决方案--------------------
A(5); //这里只是生成了一个零时对象而以,根本没有对当前对象的m_i赋值
------解决方案--------------------
A()
{
cout < < "A() " < <endl;
A(5);//这里并不是“调用A(int)函数”,而是“利用A(int)构造函数产生一个临时对象,等此条语句执行完毕再将此临时对象销毁”!楼主切忌,在C++中不可以像java一样“一个构造函数调用另一个构造函数”!!
};