首先,我建议您看一下赫伯·萨特(Herb Sutter)的以下演讲,他在演讲中就该主题提供了一些建议。大括号初始化讨论在23:00左右开始。
当您谈论原始数据类型时,所有这三种都会产生相同的结果。我个人更喜欢使用旧int x = 0
语法,但这归结为个人喜好。
对于类类型,括号初始化和老式构造函数初始化不能完全互换。例如:
vector<int> v (100); // Creates a 100-element vector
vector<int> v {100}; // Creates a 1-element vector, holding the value 100.
这是因为std::vector
具有一个明确定义std::initializer_list
为其唯一参数的构造函数。请记住
auto var = {1, 2};
创建一个std::initializer_list
,var
以其作为标识符。
关于初始化程序列表的事情是,它们提供了一致性,这是对先前可用列表的可喜变化。例如,如果要使用C ++初始化数组,则可以使用:
int arr[] = {1, 2, 3, 4};
但是,如果要vector<int>
使用相同的元素初始化a ,则必须:
arr
和arr + 4
使用C ++ 11,您可以使用
vector<int> v = {1, 2, 3, 4}; // Same syntax. Nice! Note that the = is optional
大括号初始化很有用的另一个实例是,它提供了解决C ++ 最烦人的语法的方法。从谈话中,假设我们有两个类,origin
和extents
,可以将其实例传递给构造另一个type对象rectangle
。以下语句:
rectangle w(origin(), extents());
不允许您rectangle
使用origin
和extents
临时对象创建对象,因为该语句被解析为函数声明。sk 因此,通常,您必须执行以下操作:
origin o;
extents e;
rectangle w(o, e);
通过括号初始化,您可以即时创建它们,并且
rectangle w {origin(), extents()};
将按预期工作,即传递给构造函数,该构造函数将origin
第一个参数作为extents
对象,第二个作为对象进行重载。
该规则适用于对象,除非有理由不要使用花括号初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句