Eu estava lendo as respostas para esta pergunta, prós e contras do C ++, e tive essa dúvida ao ler os comentários.
os programadores freqüentemente acham confuso que "isto" seja um ponteiro, mas não uma referência. Outra confusão é por que "hello" não é do tipo std :: string, mas é avaliado como um caractere const * (ponteiro) (após a conversão de matriz em ponteiro) - Johannes Schaub - litb 22/08/08 às 1:56
Isso mostra apenas que ele não usa as mesmas convenções que outros idiomas (posteriores). - le dorfier 22/12/08 às 3:35
Eu chamaria a coisa "isto" de uma questão bastante trivial. Epa, obrigado por detectar alguns erros nos meus exemplos de comportamento indefinido. :) Embora eu não entenda que informação sobre tamanho tem a ver com qualquer coisa no primeiro. Um ponteiro simplesmente não tem permissão para apontar para fora da memória alocada - jalf
Isso é constante? - yesraaj 22/12/08 às 6:35
isso pode ser constante se o método for const int getFoo () const; <- no escopo de getFoo, "isto" é constante e, portanto, é somente leitura. Isso evita bugs e fornece algum nível de garantia ao chamador de que o objeto não será alterado. - Doug T. 22/12/08 às 16:42
você não pode reatribuir "isso". ou seja, você não pode fazer "this = & other;", porque este é um rvalue. mas isso é do tipo T *, não do tipo T const. ou seja, é um ponteiro não constante. se você estiver em um método const, é um ponteiro para const. T const. mas o ponteiro em si é inconstante - Johannes Schaub - litb Dec 22 '08 às 17:53
pense em "this" assim: #define this (this_ + 0) onde o compilador cria "this_" como um ponteiro para o objeto e faz "this" uma palavra-chave. você não pode atribuir "this" porque (this_ + 0) é um rvalue. é claro que não é assim (não existe essa macro), mas pode ajudar a entendê-lo - Johannes Schaub - litb Dec 22 '08 às 17:55
Minha pergunta é: por que this
um ponteiro não é uma referência? Algum motivo específico para torná-lo um ponteiro?
Alguns argumentos adicionais sobre por que this
ser uma referência faria sentido:
- Considere
Item 1
fromMore Effective C++
: use reference quando for garantido que temos um objeto válido, isto é, não um NULL (minha interpretação). - Além disso, as referências são consideradas mais seguras que os ponteiros (porque não podemos estragar a memória com um ponteiro perdido).
- Terceiro, a sintaxe para acessar as referências (
.
) é um pouco melhor e mais curta do que acessar ponteiros (->
ou(*)
).
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
this
sempre avalia paratrue
?