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

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

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

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

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

Если взять обычный массив, то вывод на экран массива как переменной показывает нам адрес массива.

Иногда нужен именно адрес первого элемента массива.

С классами и ихними 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 является prvalue выражением.

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

Какая польза в this?

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


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

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

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

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

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

  • tajkinol говорит:

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

  • Lex говорит:

    Благодарю!

  • kolobok говорит:

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

  • Vasya_RB_007 говорит:

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

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

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

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

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

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

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

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

Поиск

 
     

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

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор наполовину пуст, наполовину полон

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

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