Tipo deste ponteiro
O tipo de ponteiro this pode ser alterado na declaração de função pelas palavras-chave const e volatile. Para declarar uma função como tendo os atributos de uma ou mais dessas palavras-chave, adicione as palavras-chave após a lista de argumentos da função.
Considere este exemplo:
// type_of_this_pointer1.cpp
class Point
{
unsigned X() const;
};
int main()
{
}
O código anterior declara uma função de membro, X, em que o ponteiro this é tratado como um ponteiro const para um objeto const. As combinações de opções cv-mod-list podem ser usadas, mas sempre modificam o objeto apontado por this, não o ponteiro this em si. Portanto, a seguinte declaração declara a função X; o ponteiro this é um ponteiro const para um objeto const:
// type_of_this_pointer2.cpp
class Point
{
unsigned X() const;
};
int main()
{
}
O tipo this em uma função de membro é descrito pela seguinte sintaxe, onde cv-qualifier-list é determinada pelo declarador das funções de membro e pode ser const ou volatile (ou ambos), e class-type é o nome da classe:
[cv-qualifier-list] class-type * const this
Ou seja, this sempre é um ponteiro const; não pode ser reatribuído. Os qualificadores const ou volatile usados na declaração de função de membro se aplicam à instância de classe apontada por this no escopo dessa função.
A tabela a seguir explica mais sobre como esses modificadores funcionam.
Semântica dos modificadores this
Modificador |
Significado |
---|---|
const |
Não pode alterar dados de membros; não pode chamar funções de membro que não sejam const. |
volatile |
Os dados de membro são carregados da memória sempre que são acessados; desabilita certas otimizações. |
É um erro passar um objeto const para uma função de membro que não seja const. Da mesma forma, é um erro passar um objeto volatile para uma função de membro que não seja volatile.
As funções de membro declaradas como const não podem alterar dados de membro — nessas funções, o ponteiro this é um ponteiro para um objeto const.
Dica
Os construtores e os destruidores não podem ser declarados como const ou volatile.Porém, eles podem ser chamados em objetos const ou volatile.