Boost Asio пример - странный синтаксис C ++ - PullRequest
1 голос
/ 13 июня 2011

Я только что посмотрел на фреймворк 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.

Заранее большое спасибо за любую помощь.

1 Ответ

3 голосов
/ 13 июня 2011

Хм .. почему он не может это сделать? Переменные-члены видны во всем классе, независимо от того, где они определены:

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

Если это не поможет, я думаю, вы действительно не выражаете то, что не понимаете.

...