Я читал ответы на этот вопрос плюсы и минусы 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 (
.
) немного лучше и короче, чем доступ к указателям (->
или(*)
).
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
this
всегда оцениватьtrue
?