变量初始化有什么区别?

在标头中,我有以下两个公共变量:

float testVariable1 = 1.23456789f;
float testVariable2{ 1.23456789f };

这里有什么区别? 为什么带有花括号的版本?

leemr66 回答:变量初始化有什么区别?

C ++支持三种基本方法来初始化变量。 首先,我们可以使用等号进行复制初始化:

int width = 5; // copy initialization of value 5 into variable width

这会将等号右侧的值复制到左侧创建的变量。 其次,我们可以使用括号进行直接初始化。

int width( 5 ); // direct initialization of value 5 into variable width

对于简单数据类型(如整数),复制和直接初始化本质上是相同的。但是对于某些高级类型,直接初始化的性能要好于复制初始化。 在C ++ 11之前,由于性能提高,在大多数情况下,建议直接初始化优于复制初始化。

很遗憾,直接初始化不能用于所有类型的初始化。为了提供更一致的初始化机制,C ++ 11为直接初始化添加了一种新的语法,称为花括号初始化(也称为统一初始化),该语法使用花括号:

int width{ 5 }; // brace (uniform) initialization of value 5 into variable width

希望这会对您有所帮助。

,

在这种情况下,它们具有相同的效果。

第一个是copy initialization

  

否则(如果T或other的类型都不是类类型),则在必要时使用标准转换将other的值转换为T的cv不合格版本。

第二个是direct-list-initialization

  

否则(如果T不是类类型),如果braced-init-list仅具有一个元素,并且T不是引用类型,或者是引用类型与基类相同或为基类的引用类型元素的类型,T是direct-initialized(在直接列表初始化中)或copy-initialized(在复制列表初始化中),除了不允许缩小转换。

  

否则,如有必要,使用标准转换将other的值转换为T的cv不合格版本,并且要初始化的对象的初始值为(可能是转换的)值。

作为内置类型,潜在的差异之一是list initialization中不允许缩小转换范围。 (即使在这种情况下也不会应用,因为已将初始化程序指定为float文字。)

本文链接:https://www.f2er.com/3168690.html

大家都在问