Нет, они не имеют в виду одно и то же.
Когда конструктор выполняется перед входом в блок кода (код между фигурными скобками), он создает все элементы данных объекта. Что вы делаете в инициализаторах (код после двоеточия и перед фигурными скобками), чтобы указать, какие конструкторы использовать для этих элементов. Если вы не укажете конструктор для конкретного члена данных, будет использован конструктор по умолчанию.
Итак, если вы используете список инициализации (первый пример), правильные конструкторы будут использоваться для каждого члена, и дополнительный код не требуется. Если нет, сначала используется конструктор по умолчанию, а затем выполняется код внутри фигурных скобок.
В итоге:
- В вашем первом примере каждый член инициализируется с использованием соответствующего конструктора, возможно, конструктора копирования.
- Во втором примере каждый член создается с использованием конструктора по умолчанию, а затем выполняется некоторый дополнительный код для его инициализации, возможно, оператор присваивания.
РЕДАКТИРОВАТЬ: Извините, забыл ответить на ваши вопросы в последней строке.
Имя кода между двоеточием и фигурными скобками является списком инициализации.
Если вы знаете, какой конструктор является правильным для переменной или члена данных, обязательно используйте его. По этой причине большинство классов имеют разные конструкторы, а не просто конструктор по умолчанию. Так что вам лучше использовать список инициализации.
Список инициализации почти никогда не медленнее, чем другие методы, и может легко быть быстрее. Хорошо известное правило при написании кода - «не оптимизировать преждевременно», но есть не очень известный аналог: не пессимизировать преждевременно. Если у вас есть два варианта написания фрагмента кода, и один из них может быть лучше другого, но не требует дополнительной работы или сложности, используйте его. В вашем примере нет разницы, поскольку вы используете встроенный тип (int
). Но если вы используете классы, разница будет, так что привыкните к списку инициализации.