当前位置: 首页 > 知识库问答 >
问题:

在初始值设定项列表之前,常量和引用类型是如何初始化的?

丁雅懿
2023-03-14

Ivor Horton在开始的Visual C 2013中提到了C语言中的“初始化列表”:

"对于const或引用类型的类成员,您无法选择如何初始化它们。唯一的方法是在构造函数中使用成员初始化器列表。构造函数主体内的赋值将不起作用。"

我的Visual Studio 2012 express没有编译初始值设定项列表,所以一开始我很困惑,然后我意识到它不受支持。

我的问题是人们如何在初始化器列表之前初始化const或引用类型,因为书上说除了使用初始化器列表没有其他方法?

共有2个答案

陆子航
2023-03-14

Horton的引言谈到了成员初始化列表,这是C 98的一个特性。

这和std::initializer\u list和带有类型名{stuff…}的列表初始化无关 语法,两者都是C 11的特性。

刘选
2023-03-14

你混淆了两个不同的术语。没关系;它们的命名几乎相同。

有初始化列表(我称之为“带括号的初始化列表”,正是为了避免这种混淆)。这些是用于初始化值的{}分隔的项目序列。如果项目属于同一类型,它们可以转换为std::intializer_list。这是C 11添加的。

然后,构造函数中有成员初始化列表。这就是语法:

TypeName(params)
  : member1(...)
  , member2(...)
{
  /*constructor code*/
}

这是从98/03年开始的。成员初始化列表是初始化const成员和引用类型的方式。

 类似资料:
  • 我试图理解@bolov对删除默认构造函数问题的第一个公认答案。对象仍然可以创建......有时[1] 似乎我发现了一个错误,所以它搞乱了整个解释。 @bolov解释了为什么这段代码能够在c 11中成功编译: 场景A 以及为什么这段代码无法在c 11中编译: 场景C 他说,重点是第一个foo是聚合,第二个foo不是聚合。 然后他给出了cppreference的摘录: T类型对象的列表初始化的影响是:

  • 我找不到任何关于这个具体案例的具体SO帖子,所以我想问一下我认为是/否的问题。 以下是JLS§12.4.2(Java SE 8),清单6-7: 我的问题是:这是否意味着子类的final static变量在超类的静态初始化之前初始化(假设final static作为其声明的一部分初始化)?

  • 我对Swift类有一个问题。我有UITableViewController类和UITableViewCell类的swift文件。我的问题是UITableViewCell类和网点。这个类有一个错误Class“HomeCell”没有初始化程序,我不明白这个问题。 感谢您的回复。

  • 可让PS Vita系统软件的设定回复初始设定,使主画面及开始画面皆回到至购买时的状态。 轻触[格式化]>[初始化设定]。请遵循画面指示正确操作。 重要 初始化设定后无法复原,请注意。 初始化中请勿关闭PS Vita的电源。初始化若遭到中断,可能会导致故障。 即使进行此操作,也无法让系统软件回到先前版本。

  • 我一直避免像下面这样的初始化 因为引用和指针限定符不适用于初始化。假设这是初学者学习的第一件事,与之相关的模糊性让我觉得下面的内容更清晰,也更不需要读者思考 有了C17和结构化绑定,我很开心,看到了很多潜力。C17禁止了C14和C11未能修复的东西,是一个而不是

  • 我正在尝试用C重新创建vector类 我在函数at()中得到这个错误; “int”类型的非常量引用的初始化无效 即使函数应该返回引用,也不能将指针作为地址返回吗? 代码如下所示: