首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同类型的初始化衍生工具是其他类型的,还是完全分开的?

不同类型的初始化衍生工具是其他类型的,还是完全分开的?
EN

Stack Overflow用户
提问于 2017-09-18 00:05:05
回答 2查看 60关注 0票数 2

我正在阅读有关初始化这里的内容,它讨论了不同类型的初始化,演示了其中a是一个任意变量(每个变量具有不同的语法):

  • 默认初始化T
  • 值初始化T{}
  • 直接初始化T(a)
  • 复制初始化T val = a
  • 列表初始化T{...}
  • 聚合初始化T{...}
  • 参考初始化T &ref = a
  • 零初始化T{}
  • 常数初始化static T &ref = a

复制构造函数可以通过复制初始化来使用,但是复制初始化与复制构造函数不一样。(对吧?)这使我想知道以下几点:

某些类型的初始化语法重叠,例如值初始化和零初始化都使用相似的语法,聚合初始化和列表初始化具有相似的语法等等。

问题:,这是否意味着某些类型的初始化是从其他类型派生出来的?例如,当满足特定情况时,从值初始化派生的零初始化,以及聚合初始化是列表初始化的一种形式,因为所有这些都具有类似的语法。

如果没有,那么初始化类型发生的优先级和顺序是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-18 01:35:57

按类别的顺序排列:

  1. 值初始化会导致某些类型(包括基本类型(如int) )具有一个值,而不像默认初始化(未初始化它们)。使类类型具有这种行为是可能的,这是非常有效的(如果对假定默认构造函数告诉整个故事的人来说有些困惑的话)。
  2. 直接初始化与复制初始化,因为概念实际上是正交的列表初始化,这可以是两种类型。(技术术语直接初始化和复制初始化不包括列表初始化情况。)
  3. 复制初始化通常涉及类类型的复制(或移动)构造函数。但是,实现通常会优化它,并且在C++17中构造函数调用原则上也不会发生
  4. 列表初始化只对聚合执行聚合初始化(除了涉及C++14中引入的单元素列表的某些特殊情况)。
  5. 聚合初始化和零初始化是有效的,而不是语法(尽管站点给出了char foo[2]="";的特例,因为它没有包含在通常的列表初始化规则中)。
  6. 引用初始化只是“当变量是引用而不是列表初始化时会发生什么”。它包括将初始化程序转换为引用可以绑定的对象的特殊规则。
  7. 常量初始化是调度,而不是语义:它表示某些变量比其他变量的初始化时间更早(其他变量可能在什么时候使用它们很重要)。
票数 0
EN

Stack Overflow用户

发布于 2017-09-18 00:33:40

复制构造函数可以通过复制初始化来使用,但是复制初始化与复制构造函数不一样。(对吧?)

这类似于“函数可以用于函数调用,但是函数与函数调用不一样。(对吗?)”。事实上,它们是分开的,但却是相关的概念。

问:这是否意味着某些类型的初始化是从其他类型派生出来的?

你所说的“来自他人的衍生品”是什么意思,目前还不清楚。当然,在某些值初始化情况下,将执行零初始化。但是,没有在所有值初始化中执行零初始化(例如,当类具有用户定义的构造函数时)。此外,在没有值初始化的情况下,执行零初始化(例如,静态存储持续时间的变量在任何其他初始化(如果有的话)之前初始化为零)。

您所链接的站点对执行每个可能的初始化的情况有相当详细的描述。权威描述可以在C++标准文档中找到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46269972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档