vetores - por referencia c++




Por que isso é um ponteiro e não uma referência? (3)

Independentemente de como chegamos aqui, acho que é uma sorte que este seja um ponteiro e não uma referência, pois isso ajuda "faz sentido" que você possa excluí- lo:

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

Eu acho que este é um caso em que sem necessariamente ser por design, C ++ é melhor do que é.

Eu estava lendo as respostas para esta questão C ++ prós e contras e tenho essa dúvida ao ler os comentários.

programadores freqüentemente acham confuso que "isto" é um ponteiro, mas não uma referência. outra confusão é por que "hello" não é do tipo std :: string, mas avalia para um char const * (ponteiro) (após a conversão de array para ponteiro) - Johannes Schaub - litb Dez 22 '08 at 1:56

Isso só mostra que não usa as mesmas convenções de outros idiomas (posteriores). - le dorfier 22 de dezembro de 08 a 3:35

Eu chamaria a coisa "isso" de uma questão bastante trivial. E oops, obrigado por pegar alguns erros em meus exemplos de comportamento indefinido. :) Embora eu não entenda o que informação sobre tamanho tem a ver com qualquer coisa no primeiro. Um ponteiro simplesmente não pode apontar para fora da memória alocada - jalf 22 dez '08 at 4:18

Isso é um constante poiner? - yesraaj Dec 22 '08 às 6:35

isso pode ser constante se o método for const int getFoo () const; <- no escopo de getFoo, "this" é 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 dez '08 às 16:42

você não pode reatribuir "isso". ou seja, você não pode fazer "this = & other;", porque isso é um valor. mas isso é do tipo T *, não do tipo T const. isto é, é um ponteiro não constante. Se você estiver em um método const, então é um ponteiro para const. T const. mas o ponteiro em si é nonconst - Johannes Schaub - litb 22 dez '08 at 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 tal macro), mas pode ajudar a entender isso - Johannes Schaub - litb Dec 22 '08 at 17:55

Minha pergunta é: por que isso é um ponteiro e não uma referência? Alguma razão em particular para torná-lo um ponteiro?

Alguns argumentos adicionais por que this é uma referência faria sentido:

  • Considere o Item 1 de More Effective C++ : use referências quando for garantido que temos um objeto válido, ou seja, não um NULL (minha interpretação).
  • Além disso, referências são consideradas mais seguras do que ponteiros (porque não podemos estragar a memória com um ponteiro perdido).
  • Em terceiro lugar, a sintaxe para acessar referências ( . ) É um pouco melhor e mais curta do que acessar ponteiros ( -> ou (*) ).

O padrão C ++ afirma que

9.3.2 / 1

No corpo de uma função de membro nonstatic (9.3), a palavra-chave this é uma expressão não-lvalue cujo valor é o endereço do objeto para o qual a função é chamada. O tipo disso em uma função de membro de uma classe X é X *. Se a função de membro é declarada const, o tipo disto é const X *, se a função de membro é declarada volátil, o tipo disto é volátil X *, e se a função de membro é declarada como volátil, o tipo disto é const volátil X *.

Mas em outras referências, foi encontrado algo mais ... então alguém tomou a iniciativa e mandou um e-mail para o Sr. Stroustrup . A conversa que se seguiu pode ser encontrada here .


Um pouco atrasado para a festa ... Diretamente da boca do cavalo, aqui está o que Bjarne Stroustrup tem a dizer (que é essencialmente repetido ou retirado do livro "Design and Evolution of C ++"):

Por que "isso" não é uma referência?

Porque "this" foi introduzido em C ++ (realmente em C com Classes) antes que as referências fossem adicionadas. Além disso, eu escolhi "this" para seguir o uso de Simula, ao invés do (mais tarde) uso de Smalltalk de "self".





c++-faq