Почему «это» указатель, а не ссылка? - PullRequest
172 голосов
/ 14 марта 2009

Я читал ответы на этот вопрос C ++ за и против и получил это сомнение при чтении комментариев.

программистов часто смущает, что «this» - это указатель, а не ссылка. Другая путаница заключается в том, что «hello» не относится к типу std :: string, а вычисляется как char const * (указатель) (после преобразования массива в указатель) - Johannes Schaub - litb 22 декабря 2008 г. в 1:56

Это только показывает, что он не использует те же соглашения, что и другие (более поздние) языки. - Le Dorfier Dec 22 '08 в 3: 35

Я бы назвал эту вещь довольно тривиальной проблемой. И, к сожалению, спасибо за обнаружение нескольких ошибок в моих примерах неопределенного поведения. :) Хотя я не понимаю, что информация о размере имеет отношение к чему-либо в первом. Указатель просто не может указывать за пределы выделенной памяти - jalf 22 декабря 2008 г. в 16:18

Это постоянный указатель? - Yesraaj 22 декабря 2008 в 6: 35

это может быть константой, если метод const int getFoo () const; <- в области действия getFoo «this» является константой и поэтому доступно только для чтения. Это предотвращает ошибки и обеспечивает некоторый уровень гарантии для вызывающей стороны, что объект не изменится. - Даг Т. 22 декабря 2008 года в 16: 42 </p>

Вы не можете переназначить «это». Т.е. вы не можете делать «this = & other;», потому что это значение. но это типа T *, а не типа T const. Т.е. это непостоянный указатель. если вы используете метод const, то это указатель на const. T const. но сам указатель неконстантен - Йоханнес Шауб - лит 22 декабря 2008 года в 17: 53

Думайте об «этом» следующим образом: #define this (this_ + 0), где компилятор создает «this_» как указатель на объект и делает «this» ключевым словом. Вы не можете назначить «это», потому что (this_ + 0) является значением. конечно, это не так (такого макроса нет), но это может помочь понять его - Йоханнес Шауб - лит 22 декабря 2008 г. в 17: 55

Мой вопрос: почему this указатель не является ссылкой? Есть какая-то конкретная причина сделать его указателем?


Некоторые дополнительные аргументы, почему this в качестве ссылки имеет смысл:

  • Рассмотрим Item 1 из More Effective C++: используйте ссылки, когда гарантируется, что у нас есть действительный объект, т.е. не NULL (моя интерпретация).
  • Кроме того, ссылки считаются более безопасными, чем указатели (потому что мы не можем испортить память с помощью случайного указателя).
  • В-третьих, синтаксис для доступа к ссылкам (.) немного лучше и короче, чем доступ к указателям (-> или (*)).

Ответы [ 4 ]

164 голосов
/ 14 марта 2009

Когда язык только начинал развиваться, в ранних выпусках с реальными пользователями не было никаких ссылок, только указатели. Ссылки были добавлены, когда была добавлена ​​перегрузка операторов, так как для согласованной работы требуются ссылки.

Одно из применений this - для объекта получить указатель на себя. Если бы это была ссылка, мы должны были бы написать &this. С другой стороны, когда мы пишем оператор присваивания, мы должны return *this, что выглядит проще как return this. Так что, если бы у вас был чистый лист, вы могли бы спорить в любом случае. Но C ++ развивался постепенно в ответ на отзывы сообщества пользователей (как и большинство успешных вещей). Значение обратной совместимости полностью подавляет незначительные преимущества / недостатки, вытекающие из this, являющегося ссылкой или указателем.

107 голосов
/ 15 марта 2009

Немного опоздал на вечеринку ... Прямо изо рта лошади, вот что Бьярн Страуструп должен сказать (что по сути повторяется или взято из книги "Дизайн и эволюция C ++") :

Почему «это» не ссылка?

Потому что «это» было введено в C ++ (на самом деле в C с классами) перед добавлением ссылок. Кроме того, я выбрал «this», чтобы следовать использованию Simula, а не (позже) Smalltalk-использованию «self».

0 голосов
/ 10 октября 2010

Стандарт C ++ гласит, что

9.3.2 / 1

В теле нестатика (9,3) функция-член, ключевое слово это ненулевое выражение, значение которого равно адрес объекта, для которого функция называется. Тип это в функции-члена класса X это Х *. Если функция-член объявлен const, тип этого const X *, если функция-член объявлен изменчивым, тип этого изменчивый X *, и если член функция объявлена ​​как const volatile, тип этого постоянного энергозависимого X *.

Но в других ссылках было найдено что-то еще ... поэтому кто-то проявил инициативу и выстрелил в письмо Мистеру. Страуструп . Последующий разговор можно найти здесь .

0 голосов
/ 16 марта 2009

Независимо от того, как мы сюда попали, я думаю, что повезло, что этот является указателем, а не ссылкой, поскольку это помогает "иметь смысл", что вы можете удалить это:

void A::f () {
  delete &this;
}

Я думаю, что это тот случай, когда C ++ не обязательно должен быть задуманно лучше, чем он есть.

...