假设我有以下结构:
struct A {
A() { cout << "Default ctor\n"; }
A(int) { cout << "Ctor with params\n"; }
};
然后我想创建一个对象。在Java中,我习惯于在创建对象时使用括号,所以第一个愿望是编写类似的东西:
A a();
代码编译,但a
实际上不是A
的实例,它是不同的。
所以问题是:什么是a
,为什么我要省略括号来调用默认的构造函数?
答案 0 :(得分:3)
参见the most vexing parse,你实际在做的是声明一个函数。缓解此问题的方法是消除()
或使用C ++ 11统一初始化语法,
A a;
A a{};
答案 1 :(得分:2)
在C ++中,A a();
是名为a
的函数的转发声明,它不带任何参数,并返回A
}。 不使用默认构造函数创建A
的实例。
在Java中,不需要函数的前向声明,因此可以将A a();
读取为等同于A a;
这种C ++的好奇甚至有一个名字:见https://en.wikipedia.org/wiki/Most_vexing_parse