今天在校内看到C++主页发现了一个关于构造函数的程序,小弟我没搞明白,特来

今天在校内看到C++主页发现了一个关于构造函数的程序,我没搞明白,特来求助
#include <iostream>
using namespace std; 
  class Foo
  {
  public:
  Foo()  
  {  
  cout <<"1"<< endl;
  }  
  Foo(int a = 4)
  {  
  cout << a << endl;
  }
  }; 
  int main()
  {
  Foo a(3);  
  Foo b();
  return 0;
  }
结果输出是3

首先,结果输出为什么不是31?
根据函数重载:无参调用也可以调用默认参数函数,那又为什么没有调用默认参数函数?

------解决方案--------------------
构造函数调用其中一个最合适的一个,并不是每个都要调用
------解决方案--------------------
里面的
C/C++ code

Foo b();

------解决方案--------------------
C/C++ code

Foo *b = new Foo();

------解决方案--------------------
1.Foo a(3);
Foo b;

2.Foo a(3);
Foo *b = new Foo();

避免构造函数的二义性。
------解决方案--------------------
Foo b();
....
这个是什么东西? 构造?
如果要写的话 就算不想new一个新的实例也应该写成Foo b;
多打了个括号吧
------解决方案--------------------
把Foo b();改成Foo b;

------解决方案--------------------
把Foo b();改成Foo b;
------解决方案--------------------
这个问题是我们初学者很空绕的问题 学习
------解决方案--------------------
是啊,第二个构造函数给了默认值,所以定义对象的时候要注意。
------解决方案--------------------
Foo b(); 这是个函数声明。。。
C/C++ code

int main()
{
    Foo a( 3 );
    Foo b();
    cout<<typeid( b ).name() <<endl;
    return 0;
}

------解决方案--------------------
好贴 这个问题的确是困扰好多人的问题 这样可以加深理解
------解决方案--------------------
有没有人上机试过代码呢?

------解决方案--------------------
刚刚我也试了下,觉得这个应该与编译器有关系,我在g++上使用这样的代码是编译不过去的
C/C++ code

#include <iostream>
using namespace std;  
class Foo
{
  public:
      Foo()   
      {   
          cout <<"1"<< endl;
      }   
      Foo(int a = 4)
      {   
          cout << a << endl;
      }
};

int main()
{
    Foo *a=new Foo(3);   
    Foo *b=new Foo();
    system("pause");
    return 0;
}