C++ Boost Asio示例-奇怪的C++;语法

C++ Boost Asio示例-奇怪的C++;语法,c++,constructor,instance-variables,ctor-initializer,C++,Constructor,Instance Variables,Ctor Initializer,我刚刚了解了boost asio框架和示例。在的源代码中,该代码为tcp_服务器类定义了一个构造函数,如下所示: tcp_server(boost::asio::io_service& io_service) : acceptor_(io_service, tcp::endpoint(tcp::v4(), 50500)) 我不明白构造函数是如何初始化acceptor_uu实例变量的,该变量稍后在private部分中定义?我想在构造器的主体中为这个初始化编写等价的代码(只是为了学习),但

我刚刚了解了boost asio框架和示例。在的源代码中,该代码为tcp_服务器类定义了一个构造函数,如下所示:

tcp_server(boost::asio::io_service& io_service) : acceptor_(io_service, tcp::endpoint(tcp::v4(), 50500))
我不明白构造函数是如何初始化acceptor_uu实例变量的,该变量稍后在private部分中定义?我想在构造器的主体中为这个初始化编写等价的代码(只是为了学习),但我不知道这个ivar是如何初始化的


非常感谢您的帮助。

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

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

如果这没有任何帮助,我想你真的没有表达你不理解的东西。

我想你是在问什么。@Nemo:这不是“初始化列表”。这是一个
ctor初始值设定项
@James:您不能初始化ctor主体中的任何类成员。在ctor主体运行时,所有成员都已构造。您必须在
ctor初始值设定项中执行初始化
@Nemo:“错误”无疑有点牵强(虽然严格来说,标准支持我),但它非常混乱。初始化列表通常被认为类似于
intx[3]={0,1,2}
std::vector v{0,1,2}<代码>初始化器
s是完全不同的东西,因此,术语“初始化列表”对他们来说并不理想。伙计们,我得到了初始化器列表的东西,但我对这个案例感到困惑。acceptor_u是一个对象实例,但该实例似乎是在初始值设定项列表中以某种方式构造的(传入Arguments io_服务和tcp::endpoint实例)。我试图寻找一个初始值设定项列表解释/ctor初始值设定项来解释此初始值设定项的情况,但我找不到。我发现的所有解释都适用于使用提供的值直接设置ivar的情况。@James:这在标准的
[class.base.init]
部分中有介绍。每个成员(或基)子对象都是通过向其构造函数传递参数列表来构造的。我想通常只有一个参数,但是一个参数没有什么特别的,它只是一个长度为1的列表。谢谢你的编辑-我想我从中得到的关键是你对康斯特的看法。谢谢