Одна из вещей, которая может привести к путанице в этой теме, - это то, как переменные имеют приоритет для компилятора. Например, если один из аргументов конструктора имеет то же имя, что и член класса, вы можете написать следующее в списке инициализации:
MyClass(int a) : a(a)
{
}
Но приведенный выше код имеет такой же эффект, как этот?
MyClass(int a)
{
a=a;
}
Ответ - нет. Всякий раз, когда вы вводите «a» внутри тела конструктора, компилятор сначала ищет локальную переменную или аргумент конструктора с именем «a», и только если он не находит его, он начинает искать члена класса с именем «a» (и, если ни один не доступен, он, между прочим, будет искать глобальную переменную с именем "a"). В результате вышеприведенный комментарий "a = a" назначит значение, сохраненное в аргументе "a", аргументу "a", что делает его бесполезным утверждением.
Чтобы присвоить значение аргумента члену класса "a", вам нужно сообщить компилятору, что вы ссылаетесь на значение внутри этого экземпляра класса:
MyClass(int a)
{
this->a=a;
}
Хорошо, но что, если вы сделали что-то подобное (обратите внимание, что нет аргумента, называемого "а"):
MyClass() : a(a)
{
}
Что ж, в этом случае компилятор сначала будет искать аргумент, называемый "a", и когда он обнаружит, что его нет, он присваивает значение члена класса "a" члену класса "a", что эффективно ничего не будет делать.
Наконец, вы должны знать, что вы можете назначать значения только членам класса в списке инициализации, поэтому следующее вызовет ошибку:
MyClass(int x) : x(100) // error: the class doesn't have a member called "x"
{
}