То, что называется Список инициализирующих элементов в C ++.
Существует разница между инициализацией элемента с использованием списка инициализаторов (2-й пример) и присвоением ему значения внутри тела конструктора (1-й пример).
Когда вы инициализируете поля через список инициализаторов, конструкторы будут вызываться один раз. Объект получает построенный с переданными параметрами.
Если вы используете присвоение, то поля будут сначала инициализированы конструкторами по умолчанию , а затем переназначены (через оператор присваивания ) с фактическими значениями.
Как вы видите, в последнем имеются дополнительные издержки создания и назначения, которые могут быть значительными для пользовательских классов.
Как разрешаются имена в списке после создания объекта (я понятия не имею, как он вызывается)?
public:
some_type B;
A(some_type B) : B(B)
{
}
В приведенном выше фрагменте есть две сущности с именем B
:
- Первый - это тот, который конструктор получает в качестве аргумента &
- Второй член класса
A
Переменная, полученная в качестве аргумента в конструкторе A
, передается в качестве аргумента для построения B
(путем вызова ее конструктора), который является членом класса A
. Здесь нет двусмысленности в именах, все что нужно конструктору:
this->B(B);
this
- это указатель class A
.
B()
является конструктором типа B
.
B
в скобках - экземпляр типа B
.