在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声纳);
答案 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
作为输入的构造函数,在这种情况下,大括号构成了传递给该构造函数的值列表。