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++!
Se declarou, precisa inicializá-la imediatamante!
Se você fizer isso abaixo:
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:
Um valor qualquer inicial precisa ser definido no momento da delaração da constante.
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:
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:
2º. É diferente de:
No primeiro, você NÃO consegue modificar o ENDEREÇO que ponteiro está associando:
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 deconst
, é 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:
Com isso, nenhuma outra modificação, seja do valor ou do endereço, não funcionará.
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:
Isso não compila!
A menos que você use const
no início:
Ou use outra palavra-chave: mutable
para o membro da classe:
As palavra-chave:
mutable
econst
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):
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.
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: