使用花括号声明C ++对象

5

在c++中声明对象时 -

以下是两种不同的方式:

MyClass myObj (a,b,c);

我理解这个是调用带有三个参数的构造函数

相比之下

MyClass myObbj{a,b,c};

不确定这里的花括号是什么意思?

作为参考,我正在使用以下代码

// Inertial Navigation EKF
NavEKF EKF{&ahrs, barometer, sonar};
AP_AHRS_NavEKF ahrs{ins, barometer, gps, sonar, EKF};

1. 在C++标准中,使用花括号(例如NavEKF EKF{&ahrs, barometer, sonar};)是允许的。然而,gcc 4.6.1会报错“函数定义未声明参数”。

2. 给定以下代码:

AP_AHRS_NavEKF ahrs;

AP_Baro barometer;

RangeFinder sonar;

2A. 为什么编译器会报错:

NavEKF EKF(&ahrs, barometer, sonar);

但是允许这个:

NavEKF EKF(AP_AHRS_NavEKF &ahrs, AP_Baro barometer, RangeFinder sonar);


1
你发布的代码行既是“声明”又是“定义”,但我认为在这个上下文中,“定义”更合适。 - Antonio Pérez
  1. 在C++标准中,使用花括号(curly brace)如NavEKF EKF{&ahrs, barometer, sonar}是否合法?gcc 4.6.1会报错:函数定义未声明参数。
  2. N/A
- OneGuyInDc
请查看编辑后的原始帖子,其中包含后续问题。 - OneGuyInDc
3个回答

10
基本意图是它们通常意思相同。最大的区别在于花括号可以消除“最令人烦恼的解析”,其中您试图定义一个对象,但最终实际上声明了一个函数。

因此,NavEKF EKF{&ahrs, barometer, sonar};通常将等同于NavEKF EKF(&ahrs, barometer, sonar);。但是,如果您有这样的情况: NavEKF EKF();NavEKF EKF{};不同-NavEKF EKF();声明了一个名为EKF的不带参数并返回NavEKF的函数,而NavEKF EKF {};则像你(可能)通常期望的那样创建了一个类型为NavEKF的默认初始化对象。

然而,有些情况下会存在歧义,如何解释这些内容取决于使用括号还是花括号以不同的方式解决歧义。特别是,如果使用花括号并且可以将其内容解释为initializer_list,则该内容将被解释为initializer_list。仅当失败时,无法将其视为initializer_list时,它将查找以元素作为参数的重载(此时,您会得到正常的重载分辨率,因此它基于最佳匹配,而不仅仅是“是否可能被解释为参数”)。


花括号在原始类型的情况下也很有用,尽管它与这个问题无关。 - Ashkan

-1
花括号是所谓的“统一初始化”。这个术语不是C++标准的一部分,但它被广泛理解并且很容易进行研究。特别是在提供的上下文中,它意味着“使用给定的参数调用MyObj的构造函数”。

1
Downvoter - 学会善于解释下投票的原因。 - SergeyA
3
C++ 标准并没有使用“统一初始化”这个术语,而不是选民。此外,“Google一下”并不是一个真正的答案,最多只能算是一条评论。 - M.M
3
这句话实际上没有说明使用括号和大括号的区别在哪里。 - Brian Bi
使用gcc 4.6.1时,当我使用NavEKF EKF{&ahrs, barometer, sonar}时出现错误。函数定义未声明参数。 - OneGuyInDc
1
4.6.1不是C++11。您还需要确保在编译时指定-std=c++11。 - SergeyA

-1
使用括号调用构造函数,然后根据需要选择如何初始化数据成员。
使用花括号直接初始化数据成员 - 除非定义了一个以std::initializer_list为输入的构造函数,在这种情况下,花括号形成传递给该构造函数的值列表。

2
这完全不是真的。特别是“使用花括号直接初始化数据成员,绕过任何构造函数”是无稽之谈。 - SergeyA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接