O que significa com "const" no final da declaração de função?

Eu tenho um livro, onde está escrito algo como:

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};

O que é que isso significa?

Solução

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 deconstacima só se aplica quando se adicionaconst` 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 oconstcorreto e a palavra-chaveconst`:

Constante correcção

O C++ ' const' Declaração: Porquê & Como

Comentários (6)

O "Bar" é garantido para não alterar o objeto em que está sendo invocado. Veja a seção sobre const-correctness na FAQ C++, por exemplo.

Comentários (1)

Similar a esta pergunta.

Em essência significa que o método Bar não modificará variáveis não mutáveis de membros do Foo.

Comentários (0)