Sobes.tech
Junior

O que você sabe sobre métodos constantes e não constantes?

sobes.tech IA

Resposta da IA

Os métodos constantes (const methods) em C++ são métodos de classe que são declarados com a palavra-chave const após a lista de parâmetros.

class MyClass {
public:
    void nonConstMethod();         // Método não constante
    void constMethod() const;      // Método constante
};

A palavra-chave const após a lista de parâmetros garante que o método não irá alterar o estado do objeto para o qual é chamado. Isto significa que dentro de um método constante:

  • Não se podem modificar os membros de dados não estáticos do objeto.
  • Apenas podem ser chamados outros métodos constantes do mesmo objeto.

Propósito dos métodos constantes:

  1. Segurança: Impedem alterações acidentais no estado do objeto.
  2. Uso com objetos constantes: Objetos constantes (declarados com const) só podem chamar métodos constantes. Métodos não constantes não estão acessíveis para eles.
  3. Sobrecarga: Os métodos podem ser sobrecarregados por constância. Isto permite ter dois métodos com o mesmo nome e assinatura de parâmetros, mas um será constante e o outro não. O compilador escolherá a versão adequada dependendo de se o método é chamado em um objeto constante ou não.
class MyClass {
    int value;
public:
    int getValue() const { // Versão constante
        return value;
    }
    int getValue() {       // Versão não constante
        return value++;    // Possibilidade de modificar o estado
    }
};

void test(const MyClass& objConst, MyClass& objNonConst) {
    objConst.getValue();    // Chama a versão const
    objNonConst.getValue(); // Chama a versão não const
}

Métodos não constantes:

São métodos normais de classe que podem modificar o estado do objeto. São declarados sem a palavra-chave const após a lista de parâmetros.

Utilização:

Tipo de objeto Chamada do método Qual método será chamado Explicação
const T obj.method() Apenas o método constante Não é possível modificar o estado do objeto constante.
T obj.method() Método não constante (se existir) Métodos não constantes podem modificar o estado.
T obj.method() const Método constante (se existir) Se ambas as versões existirem e a chamada for feita em um objeto não constante, a prioridade é a versão não constante. Mas é possível fazer um cast explícito ao objeto, se desejar chamar a versão constante (pouco comum).

O uso da constância é uma boa prática, pois melhora a legibilidade e segurança do código, além de permitir ao compilador realizar otimizações adicionais.