Указатель this C++
Вместо того, чтобы сразу давать определение, что же это такое — указатель this , предлагаю рассмотреть вместе с вами два простейших примера. В одном мы просто определим две функции setData() и getData() . Одна будет предлагать пользователю ввести данные, вторая будет выводить их на экран соответственно. И обратимся к ним из главной функции main() . А во втором примере, мы создадим класс class SetGetData , методы которого так же будут вносить данные и выводить их на экран. Забегая наперед, скажу, что основным отличием этих функций и методов станет то, как они принимают параметры (аргументы).
Этот пример, скорей всего, не вызвал у вас никаких вопросов и трудностей в его понимании, если уж вы дошли до изучения этой темы. Тут мы определили две функции — строки 5 — 16. Функция setData(char *s, int &n) принимает два параметра: указатель на строку и адрес переменной типа int , для того чтобы внести изменения в переменные, которые ей передадутся при вызове. Функция getData(char s[], int n) отобразит строку и число , измененные пользователем. Далее в main- функции мы просто объявляем переменные и передаем их в наши функции при вызове.
Результатом работы будет, к примеру, такое сообщение:
Тут вот какое дело, если мы, при определении функций, не укажем, какие параметры им надо принять либо не передадим переменные в качестве параметров, при вызове функций — это будет крах программы. Компилятор такого нам не простит — в ы это понимаете .
Теперь рассмотрим второй пример (Тут вы уже сразу обратите внимание на то, что мы не передаем параметры в методы ни при определении, ни при вызове методов):
Вы видите, что явно мы ни при определении, ни при вызове методов через объект, не указываем с какими параметрами будут работать методы класса. Все дело в том, что при вызове методов, которые принадлежат классу, им неявно передается тот самый указатель this . Это происходит автоматически и незаметно для нас, так как он является скрытым первым параметром любого метода-элемента класса. Указатель this указывает на адрес созданного объекта класса — в нашем случае он получает адрес объекта object и указывает методу setData() в какие элементы объекта надо внести измененные данные, а методу getData() — элементы какого объекта надо отобразить на экране.
Важно знать, что у нас есть возможность использовать указатель this явно. Так, к примеру, выглядело бы определение метода getData() , если бы мы использовали this явно:
Такая запись так же «пройдет»:
В обоих случаях можно обойтись без этого явного указания, но как это делается лучше знать по той причине, что указатель this все же используется программистами явно , в определенных случаях. Только это уже совсем другая тема. В данной статье мы лишь проходим по основам.
Теперь можно и определение дать! Указатель this — это указатель на адрес объекта класса, при этом он является скрытым первым параметром любого метода класса (кроме статических методов), а типом указателя выступает имя класса. И еще кое-что из теории:
- this является зарезервированным словом С++;
- мы можем использовать this явно в методах-элементах класса;
- а вот явно объявить, инициализировать либо изменить указатель this , возможности нет;
Так, совсем коротко, мы дали вам основную информацию по этой теме. Остались вопросы? Задавайте их в комментариях к статье. Без ответа мы вас не оставим.
When do you use the "this" keyword? [closed]
I was curious about how other people use the this keyword. I tend to use it in constructors, but I may also use it throughout the class in other methods. Some examples:
In a constructor:
31 Answers 31
I don’t mean this to sound snarky, but it doesn’t matter.
Look at the things that are important: your project, your code, your job, your personal life. None of them are going to have their success rest on whether or not you use the «this» keyword to qualify access to fields. The this keyword will not help you ship on time. It’s not going to reduce bugs, it’s not going to have any appreciable effect on code quality or maintainability. It’s not going to get you a raise, or allow you to spend less time at the office.
It’s really just a style issue. If you like «this», then use it. If you don’t, then don’t. If you need it to get correct semantics then use it. The truth is, every programmer has his own unique programing style. That style reflects that particular programmer’s notions of what the «most aesthetically pleasing code» should look like. By definition, any other programmer who reads your code is going to have a different programing style. That means there is always going to be something you did that the other guy doesn’t like, or would have done differently. At some point some guy is going to read your code and grumble about something.
I wouldn’t fret over it. I would just make sure the code is as aesthetically pleasing as possible according to your own tastes. If you ask 10 programmers how to format code, you are going to get about 15 different opinions. A better thing to focus on is how the code is factored. Are things abstracted right? Did I pick meaningful names for things? Is there a lot of code duplication? Are there ways I can simplify stuff? Getting those things right, I think, will have the greatest positive impact on your project, your code, your job, and your life. Coincidentally, it will probably also cause the other guy to grumble the least. If your code works, is easy to read, and is well factored, the other guy isn’t going to be scrutinizing how you initialize fields. He’s just going to use your code, marvel at it’s greatness, and then move on to something else.
Ключевое слово this . Назначение. Особенности применения в классах
В методах класса может быть использовано ключевое слово this . По определению this – это неявно присутствующая ссылка на текущий экземпляр класса, которая в классе имеет несколько полезных применений.
2. Случаи применения ключевого слова this в программах на C#
Ключевое слово this применяется в следующих случаях.
- Когда в методе класса существует имя, совпадающее с именем поля класса.
- Если в классе есть несколько конструкторов, то this применяется для вызова главного конструктора из других (перенаправление на главный конструктор). Это осуществляется с целью избежания дублирования кода.
- Когда в метод нужно передать ссылку на текущий объект. В этом случае, при вызове метода, указывается ключевое слово this .
- Если в классе объявлен индексатор.
3. Пример использования this для доступа к полям класса из тела метода
В примере, в классе Program объявляются два метода и два конструктора:
- конструктор Program() без параметров;
- конструктор Program() с одним параметром. В этом конструкторе продемонстрировано использование this для инициализации поля класса;
- метод PrintInt() – демонстрирует доступ к полю класса, имя которого перекрывается именем параметра метода;
- метод Print() – демонстрирует доступ к полю класса, имя которого перекрывается именем внутренней переменной, объявленной в методе.
Текст программы следующий
Результат работы программы
4. Пример применения this для вызова конструкторов класса
Ключевое слово this может быть применено для вызова одного конструктора из другого конструктора. Для класса, который содержит несколько конструкторов, выбирается главный конструктор. Это конструктор с наибольшим количеством параметров. Другие конструкторы обращаются к этому главному конструктору с помощью вызова this .
Задан класс Line , определяющий линию заданную координатами двух крайних точек (x1; y1), (x2; y2). В классе продемонстрирован вызов конструкторов с помощью ключевого слова this .
В нашем случае главный конструктор – это конструктор с 4 параметрами.
Текст программы демонстрации класса Line следующий:
Результат работы программы
5. Передача методу ссылки на текущий объект. Пример
Если в метод класса нужно передать текущий экземпляр этого класса, то используется ключевое слово this . В приведенном ниже примере ключевое слово this применяется в методе DisplayLengthOrigin() класса Point при вызове метода LengthOrigin() этого же класса.
Демонстрационный текст приложения типа Console Application следующий:
Результат работы программы:
6. Пример использования ключевого слова this для объявления индексатора
В примере реализован класс ArrayIntegers , который реализует массив целых чисел. Для доступа к элементу массива используется механизм индексаторов. В индексаторе используется ключевое слово this , которое символизирует обращение к текущему экземпляру класса. Более подробно об особенностях использования индексаторов в классах можно прочитать здесь.
Демонстрационный текст программы, созданной по шаблону Console Application приведен ниже.
Результат работы программы
7. В каких случаях в классе нельзя применять ключевое слово this ?
Ключевое слово this нельзя применять:
- в статических методах класса;
- в статических классах.
Это связано с тем, что статические методы существуют только на уровне класса и не связаны с экземплярами класса (объектами класса).
Ключевое слово this

В языке C# имеется ключевое слово this, которое обеспечивает доступ к текущему экземпляру класса. Одно из возможных применений ключевого слова this состоит в том, чтобы разрешать неоднозначность контекста, которая может возникнуть, когда входящий параметр назван так же, как поле данных данного типа. Разумеется, в идеале необходимо просто придерживаться соглашения об именовании, которое не может привести к такой неоднозначности.
Чтобы продемонстрировать наглядное применение ключевого слова this, давайте рассмотрим следующий пример:

Этот код нормально компилируется, но Visual Studio 2010 отобразит предупреждающее сообщение о том, что переменная присваивается сама себе в методе Method1(). Так же обнаружится, что значением поля ch осталась пустая строка при вызове первого метода! Эту ситуацию позволяет избежать как раз применение ключевого слова this, как это показано в примере в методе Method2().

Помимо небольшого выигрыша от использования this в неоднозначных ситуациях, это ключевое слово может быть полезно при реализации членов, поскольку такие IDE-среды, как SharpDevelop и Visual Studio 2010, включают средство IntelliSense, когда вводится this. Это может здорово помочь, когда вы забыли название члена класса и хотите быстро вспомнить его определение.
Constructor chaining
Другое применение ключевого слова this состоит в проектировании класса, использующего технику под названием сцепление конструкторов или цепочка конструкторов (constructor chaining). Этот шаблон проектирования полезен, когда имеется класс, определяющий несколько конструкторов. Учитывая тот факт, что конструкторы часто проверяют входящие аргументы на соблюдение различных бизнес-правил, возникает необходимость в избыточной логике проверки достоверности внутри множества конструкторов.

Поток логики конструкторов в данном примере описан ниже:
Создается объект за счет вызова конструктора, который принимает один аргумент типа byte.
Конструктор передает полученные данные ведущему конструктору, добавляя необходимые дополнительные начальные аргументы, не указанные вызывающим кодом.
Ведущий конструктор присваивает входные данные полям объекта.
Управление возвращается первоначально вызванному конструктору, который выполняет остальные операторы кода.
В построении цепочки конструкторов замечательно то, что этот шаблон программирования работает с любой версией языка C# и платформой .NET. Однако если целевой платформой является .NET 4.0, можно еще более упростить задачу программирования за счет использования необязательных аргументов в качестве альтернативы традиционным цепочкам конструкторов.