1

我刚刚查看了 boost asio 框架和示例。在Daytime.3 - 异步 TCP 日间服务器的源代码中,代码为 tcp_server 类定义了一个构造函数,如下所示:

tcp_server(boost::asio::io_service& io_service) : acceptor_(io_service, tcp::endpoint(tcp::v4(), 50500))

我对构造函数如何初始化稍后在私有部分中定义的acceptor_实例变量感到困惑?我想在构造函数的主体中为这个初始化编写等效的代码(只是为了学习),但我不知道这个 ivar 是如何被初始化的。

非常感谢您的帮助。

4

1 回答 1

3

嗯..为什么它不能这样做?成员变量在整个类中都是可见的,无论它们是在哪里定义的:

class Foo{
public:
  Foo(int i) : _i(i) {}

private:
  int _i;
};

如果您的意思是在冒号之后初始化的事情是如何工作的:,如果您想要标准措辞,请搜索“initializer list”/“ctor initializer”。


编辑:考虑这个类:

class Foo{
public:
  Foo(int i, float f) : _i(i), _f(f) {}

private:
  int _i;
  float _f;
};

现在考虑这个函数和其他类:

int random(){
  return 4;
}

class Bar{
public:
  Bar() : _f(random(), 3.14159f) {}

private:
  const Foo _f;
};

您可以根据需要在初始化器列表中初始化一个成员,假设该成员具有合适的构造函数。现在,对于const成员,您只能以这种方式初始化它们,因为在 ctor 主体内部,它不能再被分配了。您只能使用非常量和非引用变量来做到这一点:

class Bar{
public:
  Bar(){
    _f = Foo(random(), 3.14159f); // invoke copy assignment operator
  }

private:
  Foo _f; // non-const
};

如果这没有任何帮助,我猜你真的没有表达你不明白的东西。

于 2011-06-13T00:29:48.270 回答