c ++用花括号声明对象

时间:2015-11-30 20:57:30

标签: c++ declaration

在c ++中声明对象时 -

之间有什么区别
MyClass myObj (a,b,c);

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

VS。

MyClass myObbj{a,b,c};

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

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

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

1。 是否使用花括号 NavEKF EKF {& ahrs,barometer,sonar}; c ++标准的一部分。 gcc 4.6.1抱怨 - 函数定义没有声明参数。

2。 特定 AP_AHRS_NavEKF啊人;

AP_Baro晴雨表;

RangeFinder声纳;

2A。为什么编译器会抱怨这个

NavEKF EKF(& ahrs,晴雨表,声纳);

但允许此

NavEKF EKF(AP_AHRS_NavEKF& ahrs,AP_Baro晴雨表,RangeFinder声纳);

3 个答案:

答案 0 :(得分:8)

基本意图是它们通常意味着相同的事情。最大的区别在于花括号消除了你试图定义一个对象的“最令人烦恼的解析”,但最终实际上却声明了一个函数。

因此,NavEKF EKF{&ahrs, barometer, sonar}; 通常等同于NavEKF EKF(&ahrs, barometer, sonar);。但是,如果你有类似的内容:NavEKF EKF();NavEKF EKF{};它们不同 - NavEKF EKF();声明一个名为EKF的函数,它不带参数并返回NavEKF,而NavEKF EKF{};执行您(可能)通常期望的内容,并创建名为EKF NavEKF的默认初始化对象。

然而,有些情况下,如何解释事物的含糊不清,根据您是否使用括号或括号,歧义的解决方式会有所不同。特别是,如果你使用花括号,并且有任何方法可以将内容解释为initializer_list,那就是它的解释方式。当且仅当它失败时,所以它不能被视为initializer_list,它将寻找一个重载,它将大括号中的元素作为参数(此时,你得到正常的重载分辨率,所以它基于最合适的,不只是“它可能被解释为适合吗?”)

答案 1 :(得分:-1)

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

答案 2 :(得分:-1)

使用括号调用构造函数,然后根据需要选择如何初始化数据成员。

使用花括号直接初始化数据成员 - 除非定义了一个以std::initializer_list作为输入的构造函数,在这种情况下,大括号构成了传递给该构造函数的值列表。