【问题标题】:Importance of a singlecolon ":" in C++ [duplicate]C ++中单冒号“:”的重要性[重复]
【发布时间】:2011-01-27 13:39:51
【问题描述】:

可能重复:
What is this weird colon-member syntax in the constructor?

我很少在常规代码中遇到类中的单个冒号 例如:

A::member():b(),c()
{
}

这里的单冒号有什么重要性?为什么在这里使用它? 有时是强制性的吗?如果是在哪些情况下?

【问题讨论】:

标签: c++ member-functions


【解决方案1】:

此上下文中的单个冒号用于表示您正在使用初始化列表初始化列表用于:

  • 从派生类调用基类构造函数
  • 初始化类的成员变量

正如其他人所指出的,初始化列表只能用于类构造函数

虽然也可以在构造函数的主体中初始化成员变量,但通过初始化器列表这样做有几个原因:

  • 常量指针引用不能从构造函数的主体初始化
  • 使用 初始化列表 通常更有效,因为它只会(从内存中)调用成员的构造函数,而不是调用非 POD 代价高昂的构造函数和赋值运算符类型。

说了这么多,代码的格式有点奇怪。在我通常使用的代码中,initializer list 的使用会像这样缩进:

A::A()
    :b(),
     c()
{
}

这让我更清楚,: 与用于在 A::A() 中定义类成员资格的 :: 无关。

【讨论】:

  • 会员永远是A
  • @vava - 谢谢 - 更新了。
  • 这是否意味着每当调用构造函数时,都会调用 B 和 C 的构造函数来进行初始化?还是 B & C 是初始化函数而不是构造函数?
  • @cpp_Beginner - 编写的代码将在构造A 时调用bc 成员的默认构造函数。我不知道这些成员的类型,但我假设它们不是 POD 类型,如 int、long 或 char(IOW,具有构造函数的类)。
  • @Aram - 我的朋友叫我 LSPBH。
【解决方案2】:

单冒号指定了一个初始化列表,正如其他几个响应已经说明的那样。

一般来说,这些列表和构造函数存在许多问题。 C++ 在生成默认构造函数和复制构造函数方面做得很合理,但如果您自己编写,则一切由您自己处理:

  1. 谨慎使用invoke这个词,因为列表中的存在指定将使用哪个构造函数,它实际上并没有调用那个构造函数。我的意思是调用顺序仅由类声明控制。如果初始化的顺序与声明的顺序不同,大多数编译器都会警告您。顺序是 - 基类构造函数按照声明的顺序,然后是成员变量。将其视为对类层次结构的深度优先遍历可能会有所帮助。
  2. 列表中的项目是指定将使用哪些成员变量基类构造函数 - 对于编写复制构造函数尤其重要。
  3. 列表中未指定的基类将调用其默认构造函数。这是您编写自己的复制构造函数时的一个主要问题 - 您必须小心指定基本复制构造函数,否则它们将无法复制其成员。
  4. 不在列表中的成员未初始化
  5. 作为 4. 的推论,因此您必须记住向每个构造函数添加成员,这让您在维护方面感到头疼。
  6. 作为一个好习惯,尽量不要依赖成员初始化顺序。您应该非常努力地避免代码中一个成员必须在另一个成员之前初始化。

【讨论】:

    【解决方案3】:

    用于初始化引用。在 c++ 中,您不能分配或修改引用,因此在类中只能使用分号语法“分配”它们。

    【讨论】:

    • +1 表示“在 c++ 中,您不能分配或修改引用,因此在类中只能使用分号语法“分配”它们”
    • 单词已初始化,未赋值。 :] 初始化列表的这一要求也适用于常量值。
    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2011-04-28
    • 2014-12-18
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    相关资源
    最近更新 更多