加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C样式用于初始化单个变量

发布时间:2020-12-16 09:45:32 所属栏目:百科 来源:网络整理
导读:初始化自动管理的简单变量而不是通过赋值时,有几种不同的样式.我想知道是否有任何具体的理由支持一个而不是另一个或只是风格问题. 使用括号很有吸引力,因为它感觉类似于实例化对象 double answer(42.0);ComplexNumber i(0,1); 使用大括号是有吸引力的,因为它
初始化自动管理的简单变量而不是通过赋值时,有几种不同的样式.我想知道是否有任何具体的理由支持一个而不是另一个或只是风格问题.

使用括号很有吸引力,因为它感觉类似于实例化对象

double answer(42.0);
ComplexNumber i(0,1);

使用大括号是有吸引力的,因为它感觉类似于初始化容器

double answer{42};
std::vector<double> i{0,1};
double i2[] = {0,1};

是否有任何特别的理由支持一种风格而不是另一种风格?

解决方法

请看这里: GotW #1 : Variable Initialization.这是H. Sutter的答案的详细描述.

H. Sutter在一般意义上讲述了可变初始化的新旧风格.

根据您的开始主题背景,下面显示了该文章的快速概要.

这对

double answer(42.0); // (1)
double answer{42};  // (2)

实际上,类似于下一个初始化示例:

widget w(x);                // (d)
widget w{x};                // (e)

这些都是直接初始化.但请注意,语法{x}会创建initializer_list.如果widget有一个带有initializer_list的构造函数,那么该构造函数是首选;否则,如果widget有一个构造函数,它接受x的任何类型(可能有转换),则使用该构造函数.

有两个主要差异使(2,e)优于(1,d):

>首先,语法(2,e)是明确的,并避免“烦恼的解析”.如果x是一个类型名,那么(1,d)是一个函数声明,即使在作用域中也有一个名为x的变量(见上文),而(2,e)绝不是一个函数声明.
>其次,e)更安全,因为它不允许缩小(a.k.a.“有损”)转换,否则这些转换允许某些内置类型.考虑:

int i1(12.345); //好的:折腾.345,无论如何我们都不喜欢它

int i2 {12.345}; //错误:将是有损的隐式缩小

下一对

ComplexNumber i(0,1); // (3)
std::vector<double> i{0,1}; // (4)

与复杂对象的初始化相关联.两者看起来完全相同,但第二个帮助我们避免“烦恼的解析”,如:

ComplexNumber       w( real(),img() );       // oops,vexing parse

除此之外,这种方式使代码更清晰(如果我们使用initializer_list,则更清楚的是初始化),
而且,在某些情况下,减轻语法,例如:

draw_rect({ origin,selection });                  // C++11

Sutter guildeline是:更喜欢使用{}初始化,例如vector< int> v = {1,2,3,4};或者自动v =向量< int> {1,4} ;,因为它更一致,更正确,并且避免必须知道旧式陷阱.在单参数情况下,您更喜欢只看到=符号,例如int i = 42;和自动x =任何东西;省略括号是好的.

我们可以使用()-initialization来显式调用特殊构造函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读