4

可能重复:
构造函数中这个奇怪的冒号成员语法是什么?

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

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

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

4

3 回答 3

23

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

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

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

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

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

说了这么多,你的代码格式有点奇怪。在我通常使用的代码中,初始化列表的使用会像这样缩进:

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

这让我更清楚的是,:::用于定义类成员资格的A::A().

于 2010-03-15T05:48:09.403 回答
4

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

一般来说,这些列表和构造函数有很多陷阱。C++ 在生成默认构造函数和复制构造函数方面做得很合理,但是如果您自己编写,则由您来处理所有事情:

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

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

于 2010-03-15T05:49:25.280 回答