【问题标题】:Variable initialization, what's the difference? [duplicate]变量初始化,有什么区别? [复制]
【发布时间】:2020-02-29 11:13:14
【问题描述】:

在我的标题中,我有这两个公共变量:

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

这里有什么不同? 为什么有大括号的版本?

【问题讨论】:

    标签: c++ initialization


    【解决方案1】:

    对于这种情况,它们具有相同的效果。

    第一个是copy initialization

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

    第二个是direct-list-initialization

    否则(如果 T 不是类类型),如果花括号初始化列表只有一个元素,并且 T 不是引用类型,或者是其引用类型与基类相同或为基类的引用类型元素的类型,T 是direct-initialized(在直接列表初始化中)或copy-initialized(在复制列表初始化中),但不允许缩小转换。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      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
      

      希望这会对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-03-16
        • 2018-08-28
        • 1970-01-01
        • 2019-04-04
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        相关资源
        最近更新 更多