2011-06-13 100 views
1

我刚刚查看了boost asio框架和示例。在用于Daytime.3 - An asynchronous TCP daytime server的源代码,该代码定义了tcp_server类的构造如下:Boost Asio示例 - 奇怪的C++语法

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

我很困惑,如何构造正在初始化其在定义后在acceptor_实例变量私人部分?我想在构造函数体内为这个初始化编写等价的代码(仅供学习),但我无法弄清楚这个ivar是如何初始化的。

非常感谢您的任何帮助。

+0

你在问我[初始化列表](http://www.codeguru.com/forum/showthread.php?t=464084),我想。 – Nemo 2011-06-13 00:30:12

+1

@Nemo:这不是一个“初始化列表”。这是一个'ctor-initializer'。 – 2011-06-13 00:31:04

+1

@詹姆斯:你不能初始化ctor主体中的任何班级成员。所有成员在ctor机构运行时已经建成。您必须在'ctor-initializer'中执行初始化。 – 2011-06-13 00:31:41

回答

3

呃..为什么不能这样做呢?该成员变量是可见的通过时的全班同学,无论身在何处,他们的定义:

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

private: 
    int _i; 
}; 

如果你的意思是,虽然初始化的事情是如何工作的结肠:后,搜索“初始化列表” /“构造函数初始化“如果你想要标准的措辞。


编辑:考虑这个类:

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体内,它不能再分配。你只能做到这一点与非const和非引用变量:

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

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

如果这不是任何帮助,我想你真的不表达,你不明白。

+0

我试着寻找一个初始化程序列表解释/ ctor初始化程序,它解释了初始化程序会发生什么,但是我不能。我发现的所有解释都适用于您直接用提供的价值设置伊娃的情况。 – 2011-06-13 00:50:08

+0

@James:这个在标准的'[class.base.init]'节中讲述。每个成员(或基础)子对象都是通过将参数列表传递给其构造函数来构造的。我想通常只有一个参数,但是对于一个参数没有特别之处,它恰好是一个长度列表。 – 2011-06-13 01:13:16

+0

啊,好的。感谢编辑 - 我认为我从中得到的关键是你对const所说的。谢谢! – 2011-06-24 18:44:16