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(*)
).
this
sempre avalia paratrue
?_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
Respostas:
Quando o idioma estava evoluindo, nos primeiros lançamentos com usuários reais, não havia referências, apenas indicadores. As referências foram adicionadas quando a sobrecarga do operador foi adicionada, pois requer referências para funcionar de forma consistente.
Um dos usos de
this
é para um objeto obter um ponteiro para si mesmo. Se fosse uma referência, teríamos que escrever&this
. Por outro lado, quando escrevemos um operador de atribuição, precisamos fazê-loreturn *this
, o que pareceria mais simplesreturn this
. Portanto, se você tivesse uma lousa em branco, poderia argumentar de qualquer maneira. Mas o C ++ evoluiu gradualmente em resposta ao feedback de uma comunidade de usuários (como as coisas mais bem-sucedidas). O valor da compatibilidade com versões anteriores supera totalmente as pequenas vantagens / desvantagens decorrentes dethis
ser uma referência ou um ponteiro.fonte
operator &
para fazer algo útil. Teria que haver alguma sintaxe especial para obter o endereço disso que não passariaoperator &
.int n = 5; int &r = n; int *p = &r; std::cout << *p;
&reinterpret_cast<char&>(this);
para obter o endereço real para sobrecargaoperator&
(na verdade, isso é o queboost::addressof
faz).this
ser nulo, parece-me que uma referência é realmente mais adequada.Um pouco tarde para a festa ... Diretamente da boca do cavalo, eis o que Bjarne Stroustrup tem a dizer (que é essencialmente repetido ou retirado do livro "Design e evolução do C ++"):
fonte