Мне было интересно, есть ли какое-то преимущество, если использовать «this» для ссылки на членов класса, а не на использование его в c ++?
например…
class Test
{
public:
Test();
void print_test()
{
std::cout << this -> m_x // Using 'this'
<< endl;
std::cout << m_x // Rather than referencing 'm_x' this way
<< endl;
}
private:
int m_x;
int m_y;
};
Нет, разницы в производительности нет. Для компилятора значения идентичны.
Ну, почти … единственный раз, когда вам конкретно нужно сказать this
если у вас есть переменная с тем же именем во внутренней области видимости, которая скрывает переменную-член (что в любом случае считается плохой формой), или забавные случаи, когда у вас есть шаблонный базовый класс, и вам нужно сообщить компилятору, что имя ссылается на член базового класса (хотя это довольно редко).
Иногда это просто соглашение.
Основная идея заключается в том, что мы обычно должны использовать this->
чтобы избежать конфликтов имен:
class Value
{
public:
Value(): value(0), valueSet(false) {}
void setValue(int value) {
//value = value; ( WRONG : Naming conflict )
this->value = value; // Use this-> to distinguish between them
valueSet = true;
}
private:
int value;
bool valueSet;
}
Теперь утверждение valueSet = true;
без this->
выглядит некрасиво Поэтому люди предпочитают префикс this->
чтобы все выглядело согласованно:
void setValue(int value) {
this->value = value;
this->valueSet = true; // Isn't this consistent and beautiful?
}
Но, насколько я знаю C ++, этот шаблон не получил широкого распространения. Если бы вы когда-нибудь смотрели на некоторые Джава исходный код, префикс this.
до доступа членов поля очень часто.
PS: Другая возможная причина — возможно, люди просто хотят подчеркнуть, что это поле для членов, а не что-то еще. Поскольку большинство простых редакторов не способны выделять такие поля, это может улучшить читаемость кода.
Если вы не используете его, это будет подразумеваться. Таким образом, эти две записи эквивалентны в скомпилированном коде, потому что компилятор добавит this
,
Единственная проблема, которая может возникнуть — это неоднозначность имени переменной. Но пока вы используете соглашение префикса (или постфикса) члена с m_
или же _m
ты должен быть в безопасности.
Также вы можете увидеть Когда я должен явно использовать указатель `this`?
Нет .. В противном случае каждый написал бы такой код.
Может быть, кто-то думал, что это легко читать. Может быть, он был разработчиком Java.