Там три случая я могу думать:
Если вы хотите просто передать указатель на текущий класс:
class B;
struct A {
B* parent_;
A(B* parent) : parent_(parent) {}
};
struct B {
A* a;
B() : a(new A(this)) {}
};
В конструктора или члена функции, где член является затененный аргументом:
struct A {
int a;
void set_a(int a) { this->a = a; }
};
Здесь переменная-член «a» затенена аргументом «a», поэтому this->
используется для доступа к элементу вместо аргумента.
(вышеприведенный пример отредактированный быть функцией, а не конструктор, так как вы обычно не может присвоить этот путь в конструкторе)
Если доступ/защищенную переменную-член или функции в базовом классе класса шаблона
template <class T>
struct A {
int a;
};
template <class T>
struct B : public A<T> {
int f() { return this->a; }
}
здесь, a
в одиночку не будет зависимым именем, поэтому компилятор ожидает найти декларацию о нем в B
или базу B
, не DEP конец на T
. Добавление this->
делает поиск зависимым от типа this
, а поскольку this
является зависимым, поиск a
отложен до тех пор, пока не будет создан экземпляр f()
.
Можно было бы написать return A::a
вместо return this->a
, но в присутствии нескольких баз, прямых или косвенных, с использованием this->
является более гибким. Этот альтернативный синтаксис также ограничен переменными-членами и не виртуальными функциями - если он используется с виртуальной функцией, он будет вызываться непосредственно, а не выполнять вызов виртуальной функции.
Для C++ последнего рассмотрения верно, но для Java или C#, это не всегда условности – Geoffroy
Вот почему вы всегда называете свой член переменные, отличные от ваших локальных, например 'm_myVar' или' myVar_' и так далее. Поскольку использование 'this' не применяется, большинство проектов предпочитают принудительно использовать стандарт именования для переменных-членов. –
Я бы не сказал, что это хорошая форма использования 'this' все время. Используйте его, только если есть тени. Обычно тени тоже можно избежать. –