最近,我看到了一个相似如下示例: 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 ++书籍中找不到吗? 函数
这是一个成员初始化列表 。 您应该在任何优秀的C ++书籍中找到有关它的信息。 spa
在大多数状况下,应该初始化成员初始化列表中的全部成员对象 (可是,请注意FAQ末尾列出的例外)。 code
FAQ条目的重点是, 对象
在全部其余条件相同的状况下,若是您使用初始化列表而不是赋值,您的代码将运行得更快。 get
没错,这确实是初始化成员变量的一种方法。 除了清楚地代表这是一个初始化以外,我不肯定这有什么好处。 在代码中包含“ bar = num”能够更容易地移动,删除或误解。 io
我不知道你怎么会错过这个,这很基本。 这是初始化成员变量或基类构造函数的语法。 它适用于普通的旧数据类型以及类对象。 class
那是构造函数的初始化。 这是初始化类构造函数中成员的正确方法,由于它能够防止调用默认构造函数。 效率
考虑如下两个示例: 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
一切都与效率有关。
这称为初始化列表。 这是初始化类成员的一种方法。 使用此方法有不少好处,而不是简单地向构造函数主体中的成员分配新值,可是若是您有类成员,这些成员是常量或引用,则必须对其进行初始化。