C ++

时间:2017-06-26 10:15:46

标签: c++

假设我有以下结构:

struct A {
    A() { cout << "Default ctor\n"; }

    A(int) { cout << "Ctor with params\n"; }
};

然后我想创建一个对象。在Java中,我习惯于在创建对象时使用括号,所以第一个愿望是编写类似的东西:

A a();

代码编译,但a实际上不是A的实例,它是不同的。

所以问题是:什么是a,为什么我要省略括号来调用默认的构造函数?

2 个答案:

答案 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