С++ для начинающих Указатель this

В С++ есть ключевое слово this, которое достаточно часто используется программистами. Начинающим обычно сложно понять, что это такое.

  • this в C++ — это указатель, который указывает на объект, владеющий функцией.

Один из примеров, демонстрирующих работу this:

На самом деле это плохой пример, в подобных случаях всегда используют конструкторы, но для понимания темы подходит. Пример сам по себе исключительно как пример непрактического применения.
Уберём this и посмотрим, что произойдёт. Произойдёт вывод на экран значений неинициализированных переменных.
Переменные, отданные вовнутрь класса, к переменным класса никакого отношения не имеют, у них только-лишь названия одинаковые. Из-за одинаковых названий можно запутаться. Чтобы явно обратиться к переменным класса, можно использовать this.
Если взять обычный массив, то выводом на экран массива как переменной c помощью cout << получается адрес массива.



Иногда действительно нужен именно адрес первого элемента массива и это может быть удобно, но поначалу может немного удивлять: кто-то хотел вывести массив, а ему подсовывают адрес первого элемента массива.

С классами и их this ситуация очень похожая. В отличие от массивов, если попробовать вывести на экран название класса, то ничего не получится.


Но точно так же, как иногда нужен адрес первого элемента массива, точно так же иногда нужен адрес первого элемента экземпляра класса. Знание адреса на первый элемент даёт прекрасную возможность обработки сущности.

this — это своеобразный заменитель такого упущения. В случае с массивами нам нужно название самого массива, в случае с объектами к адресу объекта можно доступиться изнутри самого объекта. Объект хранит указатель на самого себя, этот указатель и есть this. Такое вот отличие у немного похожих сущностей.

  • Любая не статическая функция, которая является элементом класса, имеет доступ к объекту, который к ней обращается.
  • Этот доступ и даётся нам ключевым словом this.

  • Адрес объекта доступен из функции-члена как указатель this. В большинстве случаев указатель this используется неявно. Явное использование указателя this при ссылке на члены класса допустимо, хотя не рекомендуется.

  • Выражение *this обычно используется для возврата текущего объекта из функции-члена.

  • Указатель this также используется для защиты от рекурсивной ссылки.

Не самый лучший, но всё же пример:

При выполнении программы нужно ввести значения для x. Внутри класса две функции: одна обеспечивает ввод переменной, другая обеспечивает вывод данных на экран.
Теперь немного слов о типе this.

  • В теле нестатической функции класса ключевое слово this является prvalue выражением, которое есть адрес того объекта, для которого функция, собственно, вызывается.

Тип this в классе с именем MyClass будет *MyClass
Если функция класса объявлена как константная, то тип this будет const MyClass*
Если функция volatile, то тип volatile MyClass*
Если функция const volatile, то тип const volatile*

  • Прошу обратить особое внимание на одну важную деталь. Есть очень сильное и, к сожалению, печальное заблуждение считать, что указатель this является константным указателем. На самом деле он очень похож на константный указатель, ибо ведёт себя именно как константные указатели, но константным указателем он не является.
  • Правильно называть указатель this "prvalue указателем"
  • Условно указатель this можно называть временным объектом, который есть неизменяемый указатель.
  • Поведение у указателя this всегда константное, но сам он не чистого вида константа
Константное поведение указателя this — это следствие того, что this является prvalue выражением. Что значит prvalue, я толком пока что не объясню. Это выражения, природа которых такова, что их нельзя использовать в левой части вычисления: изменить их нельзя, их можно только использовать. Этим они напоминают константные сущности, но природа их константности — это свойство prvalue, а не константность const. Хорошим примером prvalue могут служить булевы true и false.
Какая польза в this? Например, в примере, который написан ниже, использование указателя делает код более привлекательным, чем без использования.

Без указателя this такой код выглядел бы так:

Согласитесь, что листинг #4.1 выглядит симпатичнее листинга #4.2
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

6 комментариев: С++ для начинающих Указатель this

  • Татьяна говорит:

    Спасибо. Все очень доступно объяснено.




    0



    0
  • tajkinol говорит:

    Очень хорошее и толковое обьяснение!




    0



    0
  • Lex говорит:

    Благодарю!




    0



    0
  • kolobok говорит:

    Не убедительно и непонятно. Зачем усложнять программу если и так работает:




    0



    0
  • Vasya_RB_007 говорит:

    Уважаемый автор. Предложение из 2-го абзаца не является лаконичным, наверное какое-то слово лишнее.

    Любая функция-элемент класса, не являющаяся статической имеет доступ к объекту, для которого она вызвана, через посредство ключевого слова this.

    1-ый вариант исправления … , через ключевое слово this.

    2-ой вариант исправления …, посредством ключевого слова this.




    0



    0
  • Андрей говорит:

    Автор, код ваш не удобен для копипаста. ЗАмените его на такой




    0



    0

Добавить комментарий

Ваш e-mail не будет опубликован.

+ 84 = 93

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/den-paylon/programmiruem-dlya-iphone-i-ipad-8481437/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Работа программиста и шамана имеет много общего - оба бормочут непонятные слова, совершают непонятные действия, и не могут объяснить, как оно работает

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок