Использование & quot; this- & gt; & quot; различать имена переменных внутри конструкторов

Я помню, я имел обыкновение делать это и работать так, как задумано:

class foobar
{
public:
foobar(int x, int y)
{
x = x; //the variables x, y belonging to the class got correctly initialized
y = y;
}

private:
int x, y;
};

Вышеизложенное работало примерно в 200 раз на Microsoft Visual C ++ 6.0 и некоторых более поздних версиях, я полагаю.
Но теперь я должен сделать это на Microsoft Studio 2013, и я должен использовать this->, в качестве таких:

class foobar
{
public:
foobar(int x, int y)
{
this->x = x; //the other way no longer initializes class vars
this->y = y;
}

private:
int x, y;
};

Произошло ли изменение спецификации языка или компилятора Microsoft?

2

Решение

Возможно, вы думаете вместо синтаксиса списка инициализатора, который было бы быть однозначным и должен корректно работать на любом (без ошибок) компиляторе C ++:

foobar(int x, int y) : x(x), y(y) { }

В этом случае x а также y прежде чем парены однозначно являются членами данных, потому что это единственное, что может быть там (кроме конструкторов для родительских типов). Внутри Parens, x а также y обратитесь к аргументам конструктора, которые скрывают элементы данных.

Я не могу придумать ни одного обстоятельства, при котором x = x; будет делать что-то кроме самоназначения без операции (кроме перегрузок с ошибками, определенных пользователем). Если бы это работало в предыдущей версии VC ++, то это было бы ошибкой компилятора VC ++. Скорее всего, вы использовали синтаксис списка инициализатора (который работает) и забыли, что это то, что вы сделали.

8

Другие решения

Или это.

class foobar {
public:
foobar(int x, int y) : x(x), y(y)
{
}

private:
int x, y;
};
2

По вопросам рекламы [email protected]