Каково имя и причина назначения переменной-члена между именем функции и фигурными скобками? - PullRequest
8 голосов
/ 02 сентября 2010

Посмотрите на этот фрагмент кода:

Size::Size(int iSetWidth, int iSetHeight)
:iWidth(iSetWidth),
iHeight(iSetHeight)
{
}

Предположительно, это означает то же самое, что и:

Size::Size(int iSetWidth, int iSetHeight)
{
    iWidth=iSetWidth;
    iHeight=iSetHeight;
}

Зачем тебе использовать первое или второе? А как зовут бывшего?

Ответы [ 3 ]

17 голосов
/ 02 сентября 2010

Нет, они не имеют в виду одно и то же.

Когда конструктор выполняется перед входом в блок кода (код между фигурными скобками), он создает все элементы данных объекта. Что вы делаете в инициализаторах (код после двоеточия и перед фигурными скобками), чтобы указать, какие конструкторы использовать для этих элементов. Если вы не укажете конструктор для конкретного члена данных, будет использован конструктор по умолчанию.

Итак, если вы используете список инициализации (первый пример), правильные конструкторы будут использоваться для каждого члена, и дополнительный код не требуется. Если нет, сначала используется конструктор по умолчанию, а затем выполняется код внутри фигурных скобок.

В итоге:

  1. В вашем первом примере каждый член инициализируется с использованием соответствующего конструктора, возможно, конструктора копирования.
  2. Во втором примере каждый член создается с использованием конструктора по умолчанию, а затем выполняется некоторый дополнительный код для его инициализации, возможно, оператор присваивания.

РЕДАКТИРОВАТЬ: Извините, забыл ответить на ваши вопросы в последней строке.

Имя кода между двоеточием и фигурными скобками является списком инициализации.

Если вы знаете, какой конструктор является правильным для переменной или члена данных, обязательно используйте его. По этой причине большинство классов имеют разные конструкторы, а не просто конструктор по умолчанию. Так что вам лучше использовать список инициализации.

Список инициализации почти никогда не медленнее, чем другие методы, и может легко быть быстрее. Хорошо известное правило при написании кода - «не оптимизировать преждевременно», но есть не очень известный аналог: не пессимизировать преждевременно. Если у вас есть два варианта написания фрагмента кода, и один из них может быть лучше другого, но не требует дополнительной работы или сложности, используйте его. В вашем примере нет разницы, поскольку вы используете встроенный тип (int). Но если вы используете классы, разница будет, так что привыкните к списку инициализации.

3 голосов
/ 02 сентября 2010

Первый из них называется списками инициализации. Вы можете получить много статей для этого.

Конкретные причины использования списков инициализаторов приведены здесь. http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

Вы можете обратиться к Effective C ++, чтобы получить полное представление о списках инициализаторов. Надеюсь, это ясно.

0 голосов
/ 02 сентября 2010

Кстати, Бьярн Страуструп сказал в Языке программирования C ++ , что некоторая эффективность может быть достигнута с помощью списка инициализации, и он рекомендовал нам использовать список инициализации!

...