Я помню, я имел обыкновение делать это и работать так, как задумано:
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?
Возможно, вы думаете вместо синтаксиса списка инициализатора, который было бы быть однозначным и должен корректно работать на любом (без ошибок) компиляторе C ++:
foobar(int x, int y) : x(x), y(y) { }
В этом случае x
а также y
прежде чем парены однозначно являются членами данных, потому что это единственное, что может быть там (кроме конструкторов для родительских типов). Внутри Parens, x
а также y
обратитесь к аргументам конструктора, которые скрывают элементы данных.
Я не могу придумать ни одного обстоятельства, при котором x = x;
будет делать что-то кроме самоназначения без операции (кроме перегрузок с ошибками, определенных пользователем). Если бы это работало в предыдущей версии VC ++, то это было бы ошибкой компилятора VC ++. Скорее всего, вы использовали синтаксис списка инициализатора (который работает) и забыли, что это то, что вы сделали.
Или это.
class foobar {
public:
foobar(int x, int y) : x(x), y(y)
{
}
private:
int x, y;
};