Test b() 还是Test b?

见下面一段代码,问语句1、2、3、4中,在编译时哪一句会报错?

#include <iostream>

using namespace std;

class Test{
public:
Test(int) {
}
Test() {
}
void fun(){
cout << "fun" << endl;
}
};

int main() {
Test a(1); // 1
a.fun(); // 2
Test b; // 3
b.fun(); // 4
return 0;
}

要是不仔细看,这道题就是个坑。
Test b() 相当于声明了一个函数,函数名叫 b,函数的返回值类型是Test。所以, b 是一个函数,b.fun()在编译时就会报错。
如果想要正确地声明变量b,应该这么写:Test b;

但是在Java中,就不会存在这个问题。因为java在new 一个对象时,会使用到new这个关键字。

class Test {
public int a;

public Test(int a) {
this.a = a;
}

public Test() {

}

public void fun() {
System.out.println(this.a);
}
}

public class TestOddEven

public static void main(String[] args) {
// TODO Auto-generated method stub

Test a = new Test(1);
a.fun(); // 1

Test b = new Test();
b.fun(); // 0

从 java 到 C++ 还是不太习惯,拜~