4

我对 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();
};

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

4

2 回答 2

7

第二个版本

MyClass c2();

是一个函数声明 - 查看最令人头疼的 parsegotw

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

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

于 2014-06-19T13:40:26.537 回答
6

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

MyClass c3{};

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

MyClass c2();

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

于 2014-06-19T13:37:36.793 回答