Я не уверен, правильно ли я назвал свой вопрос, поэтому не стесняйтесь исправлять меня. Я считаю, что:Разница между инициализацией в списке инициализации и инициализацией в конструкторе
Инициализация в списке инициализации эквивалентно
int a = a;
Инициализация в конструкторе эквивалентно
int a; a = a;
Но я до сих пор не могу понять из-за причины следующего выпуска:
#include <iostream>
using namespace std;
class test
{
int a,b;
public:
/*
test(int a, int b): a(a), b(b) {} //OUTPUT: 3 2
test(int a, int b) { a = a; b = b;} //OUTPUT: -2 1972965730
test(int c, int d) { a = c; b = d;} //OUTPUT: 3 2
Hence it does work without this pointer. Unless the variable names are same
*/
void print() { cout<<a<<" "<<b<<"\n";}
};
int main()
{
test A(3,2);
A.print();
return 0;
}
правок:
Как M.M отметил: Эквивалент
a(a)
являетсяthis->a = a
.Стоит читать: Why should I prefer to use member initialization list?
Два обходные пути:
test(int a, int b) { this->a = a; this->b = b;} test(int a, int b) { test::a = a; test::b = b;}
Есть 2 отличия: Давать значение в теле не инициализировать, так как значение уже инициализировано (за исключением примитивных типов). В вашем случае во второй версии элемент 'a' затенен параметром a, но в списке инициализации это не так (поскольку вы можете инициализировать только в списке только для списка инициализации). – Melkon
Эквивалент 'a (a)' is 'this-> a = a;' –
Не используйте одинаковые имена для членов класса и параметры методов. Это не стоит этих проблем. – Melebius