最近我看到了这样一个例子:

#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++ 11开始,成员初始化器列表可以使用list-initialization(又名list-initialization)。“统一初始化”,“带括号初始化”):

Foo(int num): bar{num} {}

它与其他上下文中的列表初始化具有相同的语义。

其他回答

它是一个成员初始化列表。你可以在任何好的c++书籍中找到有关它的信息。

在大多数情况下,您应该初始化成员初始化列表中的所有成员对象(但是,请注意FAQ条目末尾列出的例外)。

常见问题解答的要点是,

在其他条件相同的情况下,如果使用初始化列表而不是赋值,代码将运行得更快。

在这个线程中还没有提到:从c++ 11开始,成员初始化器列表可以使用list-initialization(又名list-initialization)。“统一初始化”,“带括号初始化”):

Foo(int num): bar{num} {}

它与其他上下文中的列表初始化具有相同的语义。

虽然这是一个古老的讨论,但我找不到任何关于委托构造函数的提及,它以以下方式使用了奇怪的“:”符号。

class Foo 
{
public: 
    Foo(char x, int y) 
    {}
    Foo(int y) : Foo('a', y) 
    {}
};

它只是将Foo(y)委托给Foo('a', y)。这

Foo foo(15); //=> foo('a', 15)

定义委托构造函数时,初始化列表中除了目标构造函数外不能有任何成员。

你是正确的,这确实是一种初始化成员变量的方法。我不确定这样做有什么好处,除了清楚地表示它是一个初始化。在代码中使用“bar=num”可能更容易被移动、删除或误解。

这并不难理解,这是c++初始化列表语法

基本上,在你的例子中,x将被初始化为_x, y被初始化为_y, z被初始化为_z。