Что это за странный синтаксис двоеточия (":") в конструкторе? - PullRequest
306 голосов
/ 11 ноября 2009

Недавно я видел пример, подобный следующему:

#include <iostream>

class Foo {
public:
  int bar;
  Foo(int num): bar(num) {};
};

int main(void) {
  std::cout << Foo(42).bar << std::endl;
  return 0;
}

Что означает это странное : bar(num)? Кажется, что-то инициализирует переменную-член, но я никогда раньше не видел этот синтаксис. Это похоже на вызов функции / конструктора, но для int? Не имеет смысла для меня. Возможно, кто-то мог бы просветить меня. И, кстати, есть ли какие-либо другие особенности эзотерического языка, подобные этой, которые вы никогда не найдете в обычной книге по С ++?

Ответы [ 12 ]

5 голосов
/ 11 ноября 2009

Вы правы, это действительно способ инициализации переменных-членов. Я не уверен, что в этом есть много пользы, кроме четкого выражения, что это инициализация. Наличие «bar = num» внутри кода может быть гораздо проще перемещено, удалено или неправильно истолковано.

1 голос
/ 30 мая 2017

Пока не упоминается в этом потоке: начиная с C ++ 11, список инициализатора члена может использовать инициализацию списка (он же «равномерная инициализация», «фигурная инициализация»):

Foo(int num): bar{num} {}

, которая имеет ту же семантику, что и инициализация списка в других контекстах.

...