C ++ 11构造函数(大括号)的区别

时间:2014-06-19 13:34:11

标签: c++ c++11 constructor most-vexing-parse

我对C ++很陌生,并观察到以下几行代码的行为不同

MyClass c1;
c1.do_work() //works
MyClass c2();
c2.do_work() //compiler error c2228: left side is not a class, structure, or union.
MyClass c3{};
c3.do_work() //works

头文件为

class MyClass {
public:
    MyClass();
    void do_work();
};

你能解释一下,创建对象的三种方法之间的区别是什么?为什么第二种方式会产生编译错误?

2 个答案:

答案 0 :(得分:7)

第二个版本

MyClass c2();

是一个函数声明 - 请参阅most vexing parsegotw

第一种情况是默认初始化。

最后一个案例,C ++ 11的新手,将调用默认构造函数(如果有的话),因为即使它看起来像初始化列表{},它也是空的。

答案 1 :(得分:6)

方法一和三调用默认构造函数。

MyClass c3{};

是一种名为uniform initialization的新初始化语法。这称为默认大括号初始化。但是:

MyClass c2();

声明一个函数c2,它不带任何返回类型为MyClass的参数。