【问题标题】:C++11 Difference in Constructors (Braces)C++11 构造函数的区别(大括号)
【发布时间】:2014-06-19 13:34: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

以头文件为

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

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

【问题讨论】:

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


【解决方案1】:

第二个版本

MyClass c2();

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

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

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

【讨论】:

  • 声明,不是定义 :-)
  • 发生在我们所有人身上! ;-) (+1)
【解决方案2】:

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

MyClass c3{};

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

MyClass c2();

声明一个函数c2,它不接受任何参数,返回类型为MyClass

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-03-02
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多