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

Enn*_*eon 4 c++ constructor most-vexing-parse c++11

我对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
Run Code Online (Sandbox Code Playgroud)

头文件为

class MyClass {
public:
    MyClass();
    void do_work();
};
Run Code Online (Sandbox Code Playgroud)

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

doc*_*ove 7

第二个版本

MyClass c2();
Run Code Online (Sandbox Code Playgroud)

是一个函数声明 - 看到最令人烦恼的解析getw.

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

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


yiz*_*lez 6

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

MyClass c3{};
Run Code Online (Sandbox Code Playgroud)

是一种称为统一初始化的新初始化语法.这称为默认大括号初始化.然而:

MyClass c2();
Run Code Online (Sandbox Code Playgroud)

声明一个函数c2,该函数不带任何返回类型的参数MyClass.