1) Ключевое слово this позволяет ссылаться внутри определения класса к текущему экземпляру объекта и любым его членам.
2) this возвращает указатель на объект и для ссылки на его члены необходимо использовать оператор -> (минус со стрелкой) а не оператор . (точка).
3) Ключевое слово thisнедоступно в статических методах класса, но это и логично, статические методы относятся ко всему классу а не к конкретному объекту (экземпляру)
4) Также может возникнуть необходимость вернуть объект из функции класса, тогда это можно сделать используя указатель на текущий объект класса this. Это позволяет каскадировать функции применимые к объекту (в приведенном ниже примере это up_left.move(5).mul(-1);)
#include <iostream> // cout
using namespace std;
class Point{ // Класс точка
private: // Закрытые члены класса
int x; // Координата точки х
int y; // Координата точки y
public: // Открытые члены класса
Point(int x, int y){ // Конструктор объекта
this->x = x; // this->x относится к закрытой переменной х, а х - к параметру функции
this->y = y; // this->y относится к закрытой переменной y, а y - к параметру функции
}
void print(){ // Функция для вывода координат точки
cout << "x = " << x << ", y = " << y << endl; // Вывод координат точки
}
Point& move(int offset){ // Функция смещает координаты х и у точки на offset (амперсанд нужен для передачи по ссылке)
x += offset; // Смещаем координаты точки x
y += offset; // Смещаем координаты точки y
return *this; // Смещаем возвращаем объект (разыменованный указатель)
}
Point& mul(int offset){ // Функция умножает координаты х и у точки на offset (амперсанд нужен для передачи по ссылке)
x *= offset; // Смещаем координаты точки x
y *= offset; // Смещаем координаты точки y
return *this; // Смещаем возвращаем объект (разыменованный указатель)
}
};
int main(){
Point center(100, 100); // Создали объект center с координатами 100, 100
Point up_left(30, 20); // Создали объект up_left с координатами 30, 20
center.print(); //x = 100, y = 100
up_left.print(); //x = 30, y = 20
up_left.move(5).mul(-1); // Операторы возвращающие объект можно каскадировать неограниченное количество раз
up_left.print(); //x = -35, y = -25
}