【问题标题】:Boost Asio example - strange C++ syntaxBoost Asio 示例 - 奇怪的 C++ 语法
【发布时间】:2011-09-13 14:46:32
【问题描述】:

我刚刚查看了 boost asio 框架和示例。在Daytime.3 - An asynchronous TCP daytime server的源码中,代码为tcp_server类定义了一个构造函数,如下:

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

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

非常感谢您的任何帮助。

【问题讨论】:

  • 你在问initialization lists,我想。
  • @Nemo:这不是“初始化列表”。这是ctor-initializer
  • @James:您不能在 ctor 主体中初始化任何类成员。在 ctor 主体运行时,所有成员都已构建完毕。您必须在ctor-initializer 中执行初始化。
  • @Nemo:“错误”无疑有点牵强(尽管严格来说,标准支持我),但它非常令人困惑。初始化列表通常被认为类似于int x[3] = { 0, 1, 2 };std::vector<int> v{0,1,2};ctor-initializers 是完全不同的东西,因此,“初始化列表”一词对他们来说并不理想。
  • 伙计们,我得到了初始化列表的东西,但我对这种情况感到困惑。 acceptor_ 是一个对象实例,但该实例似乎是在初始化列表中以某种方式构造的(传入参数 io_service 和一个 tcp::endpoint 实例)。

标签: c++ constructor instance-variables ctor-initializer


【解决方案1】:

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

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
};

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

【讨论】:

  • 我试图寻找一个初始化列表解释/ctor初始化器来解释初始化器会发生什么,但我不能。我发现的所有解释都适用于您直接在 ivar 上设置并提供值的情况。
  • @James:标准的[class.base.init] 部分对此进行了介绍。每个成员(或基)子对象都是通过将参数列表传递给其构造函数来构造的。我猜通常只有一个参数,但一个参数并没有什么特别之处,它恰好是一个长度为 1 的列表。
  • 嗯,好的。感谢您的编辑 - 我认为我从中得到的关键是您所说的关于 const 的内容。谢谢!
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 2012-10-26
  • 2016-12-23
  • 2017-12-06
  • 1970-01-01
  • 2023-04-09
  • 2011-03-08
  • 1970-01-01
相关资源
最近更新 更多