Possivel duplicata: Significado de “const” último em uma declaração do método C++?
Eu tenho um livro, onde está escrito algo como:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
O que é que isso significa?
A "const function", denotado com a palavra-chave const
após uma declaração de função, faz com que seja um erro de compilação para esta função de classe alterar uma variável membro da classe. Entretanto, a leitura de uma variável de classe está ok dentro da função, mas escrever dentro desta função irá gerar um erro de compilação.
Outra maneira de pensar sobre tal "const function" é vendo uma função de classe como uma função normal tomando um 'este' ponteiro implícito. Então um método int Foo::Bar(int random_arg)
(sem a const no final) resulta em uma função como int Foo_Bar(Foo* this, int random_arg)
, e uma chamada como Foo f; f.Bar(4)
corresponderá internamente a algo como Foo f; Foo_Bar(&f, 4)
. Agora adicionando a const no final (int Foo::Bar(int random_arg) const
) pode então ser entendida como uma declaração com uma const este ponteiro: int Foo_Bar(const Foo* this, int random_arg)
. Como o tipo de this
em tal caso é const, nenhuma modificação das variáveis de membros é possível.
É possível soltar o "const function" restrição de não permitir que a função escreva para qualquer variável de uma classe. Para permitir que algumas variáveis possam ser escritas mesmo quando a função é marcada como "const function" estas variáveis de classe são marcadas com a palavra-chave `mutable'. Assim, se uma variável de classe estiver marcada como mutável, e um "const function" escreve-se a esta variável, então o código compilará de forma limpa e a variável é possível de ser alterada. (C++11)
Como de costume quando se lida com a palavra-chave const', mudar a localização da palavra-chave const numa instrução C++ tem significados completamente diferentes. A utilização de
constacima só se aplica quando se adiciona
const` ao final da declaração da função após o parêntese.
O const' é um qualificador altamente utilizado em C++: a sintaxe e a ordenação muitas vezes não é simples em combinação com apontadores. Algumas leituras sobre o
constcorreto e a palavra-chave
const`: