Давайте рассмотрим очень простой код на С++. У нас есть переменная x, присваиваем ей значение 3 и выводим. Потом присваиваем значение 8 и снова выводим. Давайте запустим программу, увидим что да, все работает, все правильно, действительно вводится 3, 8. Что здесь важно? Что всякий раз, когда мы пишем "x = что-нибудь", мы записываем это значения в переменную x, которая объявлена в начале функции main. Теперь давайте рассмотрим класс ValueHolder. В данном случае это структура, у этого класса есть поле x и метод SetValue, который принимает какое-то значение, записывает в поле x и выводит значение этого самого поля. И давайте мы воспользуемся классом ValueHolder. Мы объявим две переменные, a и b, и сделаем вызов a.SetValue(3), b.SetValue(5). Компилируем, запускаем и в консоль вывелось три и пять. Ну, ожидаемо. Пытливый слушатель может задаться вопросом, а как же компилятор догадывается в какую именно переменную, и в какую именно область памяти нужно записать значение при выполнении этой команды x = value, потому что в начале видео мы рассмотрели пример с целочисленными переменными, там все было понятно, есть переменная функция main, и мы туда все время записываем. Но здесь у нас есть одна строчка кода x = value. Однако, в зависимости от того, для какой переменной a или b мы ее вызываем эту команду, у нас значения записываются в разные области памяти. Как же это работает? Как компилятор догадывается, куда писать? Дело в том, что под капотом указатель this является неявным параметрам всех методов классов, то есть когда компилятор компилирует ваш код, то он генерирует функцию наподобие следующей. Вот есть у нас метод SetValue. Из него на самом деле генерируется функция, которая первым параметром принимает указатель на объект структуры ValueHolder, в которой хранятся данные, и это функция вот таким образом обращается к полям класса. Она разыменовывает указатель this и обращается к соответствующим полям. Таким образом когда вот здесь мы вызываем SetValue для a и SetValue для b, в эту функцию передаются разные указатели, и по этим указателей мы обращаемся к разным ячейкам памяти, хранящим поле x. На самом деле в некоторых языках программирования, например, в Python, даже требуется в методы явно передавать ссылку или указатель на текущий объект класса. Но в С++ этот указатель передается неявно. Вот давайте мы отменим наши изменения и вернемся к традиционному синтаксису для классов, и вот здесь, вот когда мы обращаемся к полю x, мы на самом деле можем написать вот так: "this, оператор разыменования, x", и это будет то же самое, тоже будет работать точно так же. Вот каждый раз, когда мы обращаемся к полю, компилятор за нас добавляет неявно вот этот вот обращение к указателю this. ну и с методами то же самое, то есть когда мы изнутри класса вызываем какой-то метод этого же класса, то к нему компилятор неявно добавляет this, поэтому давайте подведем итоги. Итак, в этом видео мы узнали, что указатель this является неявным параметрам всех методов класса, и когда внутри метода мы обращаемся к какому-то полю, например, оно называется field, то на самом деле мы обращаемся к области памяти, то есть мы берем указатель this, разыменовываем его и обращаемся к соответствующему полю.