构造函数中这种奇怪的冒号成员(“:”)语法是什么?

最近,我看到了一个相似如下示例: ios

#include <iostream>

class Foo {
public:
  int bar;
  Foo(int num): bar(num) {};
};

int main(void) {
  std::cout << Foo(42).bar << std::endl;
  return 0;
}

这个奇怪的: bar(num)是什么意思? 它彷佛以某种方式初始化了成员变量,但我以前从未见过这种语法。 它看起来像一个函数/构造函数调用,但要使用int吗? 对我来讲毫无心义。 也许有人能够启发我。 并且,顺便说一句,还有其余任何深奥的语言功能,在普通的C ++书籍中找不到吗? 函数


#1楼

这是一个成员初始化列表 。 您应该在任何优秀的C ++书籍中找到有关它的信息。 spa

在大多数状况下,应该初始化成员初始化列表中的全部成员对象 (可是,请注意FAQ末尾列出的例外)。 code

FAQ条目的重点是, 对象

在全部其余条件相同的状况下,若是您使用初始化列表而不是赋值,您的代码将运行得更快。 get


#2楼

没错,这确实是初始化成员变量的一种方法。 除了清楚地代表这是一个初始化以外,我不肯定这有什么好处。 在代码中包含“ bar = num”能够更容易地移动,删除或误解。 io


#3楼

我不知道你怎么会错过这个,这很基本。 这是初始化成员变量或基类构造函数的语法。 它适用于普通的旧数据类型以及类对象。 class


#4楼

那是构造函数的初始化。 这是初始化类构造函数中成员的正确方法,由于它能够防止调用默认构造函数。 效率

考虑如下两个示例: stream

// Example 1
Foo(Bar b)
{
   bar = b;
}

// Example 2
Foo(Bar b)
   : bar(b)
{
}

在示例1中:

Bar bar;  // default constructor
bar = b;  // assignment

在示例2中:

Bar bar(b) // copy constructor

一切都与效率有关。


#5楼

这称为初始化列表。 这是初始化类成员的一种方法。 使用此方法有不少好处,而不是简单地向构造函数主体中的成员分配新值,可是若是您有类成员,这些成员是常量引用,必须对其进行初始化。

相关文章
相关标签/搜索