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

C++11 Difference in Constructors (Braces)

本文关键字:区别 构造函数 c++      更新时间:2023-10-16

我是一个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();
};

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

第二版

MyClass c2();

是一个函数声明——参见最烦人的解析和get。

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

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

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

MyClass c3{};

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

MyClass c2();

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

相关文章: