Я читал ответы на этот вопрос плюсы и минусы C ++ и получил это сомнение, читая комментарии.
Программисты часто путают, что «это» - указатель, а не ссылка. Другая путаница заключается в том, что «hello» не относится к типу std :: string, а вычисляется как char const * (указатель) (после преобразования массива в указатель) - Йоханнес Шауб - litb 22 декабря 2008 г. в 1:56
Это только показывает, что он не использует те же соглашения, что и другие (более поздние) языки. - Le Dorfier 22 декабря 2008 в 3:35
Я бы назвал эту вещь довольно тривиальной проблемой. И, к сожалению, спасибо за обнаружение нескольких ошибок в моих примерах неопределенного поведения. :) Хотя я не понимаю, какое отношение имеет размер к первому. Указателю просто не разрешено указывать вне выделенной памяти - jalf 22 декабря 2008 в 4:18
Это постоянный указатель? - Yesraaj 22 декабря 2008 в 6:35
это может быть константой, если метод const int getFoo () const; <- в области действия getFoo «this» является константой и поэтому доступно только для чтения. Это предотвращает ошибки и обеспечивает некоторый уровень гарантии для вызывающей стороны, что объект не изменится. - Дуг Т. 22 декабря 2008 в 16:42
Вы не можете переназначить «это». то есть вы не можете делать «this = & other;», потому что это значение. но это типа T *, а не типа T const. т.е. это непостоянный указатель. если вы используете метод const, то это указатель на const. T const. но сам указатель неконстантен - Йоханнес Шауб - litb 22 декабря 2008 в 17:53
Думайте об «этом» следующим образом: #define this (this_ + 0), где компилятор создает «this_» как указатель на объект и делает «this» ключевым словом. Вы не можете назначить «это», потому что (this_ + 0) является значением. конечно, это не так (такого макроса нет), но это может помочь понять это - Йоханнес Шауб - litb 22 декабря 2008 г. в 17:55
Мой вопрос: почему this
указатель не является ссылкой? Есть ли какая-то конкретная причина сделать его указателем?
Некоторые дополнительные аргументы, почему this
иметь ссылку, имеет смысл:
- Рассмотрим
Item 1
изMore Effective C++
: используйте ссылки, когда гарантируется, что у нас есть действительный объект, т.е. не NULL (моя интерпретация). - Кроме того, ссылки считаются более безопасными, чем указатели (потому что мы не можем испортить память с помощью случайного указателя).
- В-третьих, синтаксис для доступа к reference (
.
) немного лучше и короче, чем доступ к указателям (->
или(*)
).
this
всегда оцениватьtrue
?_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
Ответы:
Когда язык только начинал развиваться, в ранних выпусках с реальными пользователями не было никаких ссылок, только указатели. Ссылки были добавлены, когда была добавлена перегрузка операторов, так как она требует, чтобы ссылки работали согласованно.
Одним из применений
this
является то, что объект получает указатель на себя. Если бы это была ссылка, мы должны были бы написать&this
. С другой стороны, когда мы пишем оператор присваивания, мы должныreturn *this
это выглядеть прощеreturn this
. Так что, если бы у вас был чистый лист, вы могли бы спорить в любом случае. Но C ++ развивался постепенно в ответ на отзывы сообщества пользователей (как и большинство успешных вещей). Значение обратной совместимости полностью подавляет незначительные преимущества / недостатки, возникающие из-заthis
того, что они являются ссылкой или указателем.источник
operator &
что-нибудь полезное. Должен быть какой-то особый синтаксис для получения адреса, который не будет проходитьoperator &
.int n = 5; int &r = n; int *p = &r; std::cout << *p;
&reinterpret_cast<char&>(this);
чтобы получить реальный адрес для перегрузкиoperator&
(на самом деле, это то, чтоboost::addressof
делает).this
быть нулевым, мне кажется, что ссылка действительно более подходящая.Немного опоздал на вечеринку ... Прямо из уст лошади вот что говорит Бьярн Страуструп (что по сути повторяется или взято из книги "Дизайн и эволюция C ++"):
источник