As várias 'faces' de const C++

3 regrinhas básicas já dá pra 'pegar' a lógica pra muita coisa!


As várias 'faces' de const C++


Sim, o C++ é grande. Mas, você não precisa saber de tudo para escrever grandes ou bons códigos, principalmente se levarmos em conta o tamanho da STL. No entanto, se você compreender as regras básicas de forma detalhada, todas as outras coisas que irão te levar para um caminho “quase infinito” serão sempre as mesmas regras com especificações intuitivas.

Uma das coisas básicas do C++ é o uso da palavra-chave const(constante, valor não modificável). Assim como sabemos, ela é imutável/read only, ou seja, uma vez atribuido um valor, a declaração não pode ser modificada.

Mas, existem contextos de uso. Vamos ver “algumas faces” do const C++!


Regra 1

Se declarou, precisa inicializá-la imediatamante!

Se você fizer isso abaixo:

const int x;

Por padrão, não compila. Obterá erro :

■ Default initialization of an object of const type 'const int' (fix available).

Se você for muito teimoso, pode usar a flag -fpermissive e conseguirá compilar. Não sei porque existe essa flag, mas eu aconselho a nunca usá-la.

Se quiser compilar, precisa inicializá-la:

const int x = 10;

Um valor qualquer inicial precisa ser definido no momento da delaração da constante.


Regra 2

As posições da palavra-chave const são intercambiáveis para valores de não endereços!

Não há, absolutamente, nenhuma diferença entre as declarações abaixo:

const int x = 0;
int const y = 0;

A única forma errada é pôr const ao final do lvalue: ~int x const = 0;~.

Mas, essa regra só vale para não endereços, pois quando você está declarando ponteiros, a posição tem resultados diferentes, Ou seja:

1º. Isso:

const int * x = &value1;

2º. É diferente de:

int * const y = &value1;

No primeiro, você NÃO consegue modificar o ENDEREÇO que ponteiro está associando:

*x = &value2;      Read-only variable is not assignable

Mas, consegue modificar o VALOR que o ponteiro está apontando: x = &value2;. E lembre-se que endereços são diferentes de valores, logo, isso: x = value2;, sem o sinal de (des)referência(&), independente de const, é outro tipo de erro: Erro de lógica!

Para o segundo caso, é o inverso das explicações do primeiro!

Você ainda pode combinar(usar duas vezes) a palavra-chave const na mesma declaração, ou seja, tornar tanto o endereço quanto o valor imutáveis:

const int * const z = &value1;

Com isso, nenhuma outra modificação, seja do valor ou do endereço, não funcionará.


Regra 3

Usar a palavra-chave const ao final da declaração de uma FUNÇÃO-MEMBRO(destaquei, pois isso não funciona em funções não-membros), você só não pode modificar algum outro membro de uma classe. Exemplo:

class MyClass {
  std::string m_str;
  public:
    void member() const {
      this->m_str = "Hello";  No viable overloaded '='
    }
};

Isso não compila!

A menos que você use const no início:

class MyClass {
  std::string m_str;
  public:
    const void member() {
      this->m_str = "Hello";
    }
};

Ou use outra palavra-chave: mutable para o membro da classe:

class MyClass {
  mutable std::string m_str;
  public:
    void member() const {
      this->m_str = "Hello";
    }
};

As palavra-chave: mutable e const não podem ser misturadas, por uma questão lógica!

Uma vez um inscrito no Curso de C++ Moderno me questionou o “porque” de conseguir modificar uma variável que recebe o valor retornado de uma função(membro ou não-membro):

const int myFunction(const int& z){
  return z + 2;
}

int main(){
  int myVar = myFunction(9);
  myVar = 3;
}

Parece meio sem sentido, mas a tarefa de const nesse caso só tem haver com “não modificações” em tempo de execução. Bom, isso realmente soa estranho e pode confundir bastante, seria mais um tipo de “estilo” de escrita!

No entanto, as regras para os parâmetros passados para funcões: int myFunction(const int a)(constante a, nesse caso), são as mesmas se não fossem parâmetro de função.


Conclusão

Pode ser “muita coisa” pra uns e “pouca coisa” para outros. Mas, essas 3 regrinhas básicas servem para constextualizar que posições e locais de utilização no C++, pode ou não influenciar no resultado final.

Caso queira se aprofundar ainda mais, sugiro os links abaixo:


cpp cppdaily


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!