1

Boostasioフレームワークと例を見てきました。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;
};

コロンの後に初期化がどのように機能するかを意味する場合:、標準の表現が必要な場合は、「初期化リスト」/「ctor初期化子」を検索してください。


編集:このクラスを検討してください:

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 に答える