Я видел два разных способа использования списков инициализаторов элементов. Первый такой:
class ClassName {
public:
arg_type_1 varName1;
arg_type_2 varName2;
// Constructor.
ClassName(arg_type_1 arg_name_1, arg_type_2 arg_name_2)
: varName1(arg_name_1), varName2(arg_name_2)
{
}
}
Что там происходит понятно. В конструкторе у нас есть список аргументов, и мы используем их для инициализации членов класса. Например, arg_name_1
используется для инициализации значения переменной varName1
класса.
Другой способ использования инициализатора члена появляется в случае наследования:
class ChildClass : public ParentClass
{
ChildClass(string name) : ParentClass( name )
{
// What can we put here and why we might need it.
}
};
Что здесь происходит, тоже понятно. Когда мы вызываем конструктор ChildClass
с одним строковым аргументом, он вызывает конструктор ParentClass
с тем же строковым аргументом.
Что мне непонятно, так это то, как компилятор различает эти два случая (синтаксис тот же). Например, во втором примере компилятор может подумать, что ему нужно взять значение переменной name
и присвоить его переменной ParentClass
из ChildClass
, а потом он увидит, что такая переменная не объявлена в ChildClass
.
Второй непонятный мне момент — почему мы можем захотеть поместить какой-то контент в тело конструктора из второго примера. Даже из ничего он уже создает и возвращает объект, используя конструктор родительского класса.