c++用大括号声明对象

c++ declaring objects with curly braces

本文关键字:声明 对象 c++      更新时间:2023-10-16

在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。大括号的使用与中一样吗NavEKF EKF{&ahrs,气压计,声纳};c++标准的一部分。gcc 4.6.1抱怨-函数定义没有声明参数。

2。鉴于AP_AHRS_AVEKF AHRS;

AP-Baro气压计;

测距声纳;

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

NavEKF EKF(&ahrs,气压计,声纳);

但允许此

NavEKF EKF(AP_AHRS_NavEKF&AHRS,AP_Baro气压计,测距声纳);

基本意图是它们通常意味着相同的东西。最大的区别在于,花括号消除了"最麻烦的解析",在这种解析中,您试图定义一个对象,但最终却实际声明了一个函数。

因此,NavEKF EKF{&ahrs, barometer, sonar};,通常将等价于NavEKF EKF(&ahrs, barometer, sonar);。然而,如果您有类似的东西:NavEKF EKF();NavEKF EKF{};,它们是不同的——NavEKF EKF();声明了一个名为EKF的函数,该函数不接受参数并返回NavEKF,而NavEKF EKF{};执行您(可能)通常期望的操作,并创建一个类型为NavEKF的名为EKF的默认初始化对象。

然而,在某些情况下,如何解释事物存在歧义,并且歧义的解决方式因使用括号还是大括号而异。特别是,如果您使用大括号,并且有任何方法可以将内容解释为initializer_list,那么它就是这样解释的。如果并且只有当它失败了,所以它不能被视为initializer_list时,它才会寻找一个以大括号中的元素为参数的重载(在这一点上,你会得到正常的重载解析,所以它是基于最佳拟合,而不仅仅是"它可能被解释为完全拟合吗?")

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

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

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