Então, por que exatamente é sempre recomendável usar const o mais rápido possível? Parece-me que usar const pode ser mais uma dor do que uma ajuda em C ++. Mas, novamente, estou abordando isso da perspectiva do python: se você não quiser que algo seja alterado, não mude. Então, com isso dito, aqui estão algumas perguntas:
Parece que toda vez que eu marcar algo como const, recebo um erro e tenho que alterar alguma outra função em algum lugar para ser const também. Então isso me faz ter que mudar outra função em outro lugar. Isso é algo que fica mais fácil com a experiência?
Os benefícios do uso de const realmente suficientes para compensar o problema? Se você não pretende alterar um objeto, por que não simplesmente não escrever um código que não o mude?
Devo observar que, neste momento, estou mais focado nos benefícios do uso de const para fins de correção e manutenção, embora também seja bom ter uma idéia das implicações de desempenho.
fonte
const
Respostas:
Este é o artigo definitivo sobre "const correctness": https://isocpp.org/wiki/faq/const-correctness .
Em poucas palavras, usar const é uma boa prática porque ...
O compilador pode otimizá-lo. Por exemplo, você está protegido contra
Ao mesmo tempo, o compilador pode gerar código mais eficiente porque sabe exatamente qual será o estado da variável / função em todos os momentos. Se você estiver escrevendo um código C ++ rígido, isso é bom.
Você está certo, pois pode ser difícil usar a correção constante de forma consistente, mas o código final é mais conciso e seguro para programar. Quando você faz muito desenvolvimento em C ++, os benefícios disso se manifestam rapidamente.
fonte
const
As variáveis podem melhorar a velocidade, no sentido de que o compilador pode gerar um código mais ideal, pois conhece toda a intenção e uso da variável. Você notará a diferença? Bem, isso é discutível em sua inscrição. No que diz respeito à simultaneidade, as variáveis constantes são somente leitura, o que significa que não há necessidade de bloqueios exclusivos nessas variáveis, pois o valor sempre será o mesmo.const
segurança para threads e o tratamento do seu próprio código dessa maneira facilita a verificação de possíveis problemas de multiencadeamento e é uma maneira fácil de fornecer garantias de API para seus usuários.Aqui está um pedaço de código com um erro comum contra o qual a correção constante pode protegê-lo:
fonte
Por experiência, este é um mito total. Isso acontece quando non-const-correct se assenta com o código const-correct, com certeza. Se você projeta a correção constante desde o início, isso NUNCA deve ser um problema. Se você criar algo const e depois algo não se compilar, o compilador está dizendo algo extremamente importante e você deve reservar um tempo para corrigi-lo corretamente .
fonte
const
corretamente (isto é, "desde o início"), então de fato não haveria um problema, que é exatamente o ponto!Não é para você quando você está escrevendo o código inicialmente. É para alguém (ou você, alguns meses depois) que está olhando a declaração do método dentro da classe ou interface para ver o que ela faz. Não modificar um objeto é uma informação significativa a ser obtida.
fonte
Se você usa const rigorosamente, ficaria surpreso com a quantidade de variáveis reais na maioria das funções. Muitas vezes, não mais do que um contador de loop. Se o seu código está chegando a esse ponto, você tem uma sensação calorosa por dentro ... validação por compilação ... o domínio da programação funcional está próximo ... você quase pode tocá-lo agora ...
fonte
const é uma promessa que você está fazendo como desenvolvedor e solicita a ajuda do compilador para fazer cumprir.
Minhas razões para estar constantemente correto:
fonte
Minha filosofia é que, se você usar uma linguagem exigente com verificações de tempo de compilação, faça o melhor uso possível.
const
é uma maneira imposta pelo compilador de comunicar o que você quer dizer ... é melhor do que comentários ou doxygen jamais serão. Você está pagando o preço, por que não deduzir o valor?fonte
Programar C ++ sem const é como dirigir sem o cinto de segurança.
É doloroso colocar o cinto de segurança cada vez que você entra no carro e 364 de 365 dias você chega em segurança.
A única diferença é que, quando você tiver problemas com seu carro, sentirá isso imediatamente, enquanto que com a programação sem const, talvez seja necessário procurar por duas semanas o que causou esse acidente, apenas para descobrir que você inadvertidamente confundiu um argumento de função que você passou por referência não const para obter eficiência.
fonte
Para programação incorporada, usando
const
criterioso ao declarar estruturas de dados globais pode economizar muita memória RAM, fazendo com que os dados constantes sejam localizados na ROM ou no flash sem copiar para a RAM no momento da inicialização.Na programação diária, usar
const
cuidadoso ajuda a evitar a gravação de programas que travam ou se comportam de maneira imprevisível, porque eles tentam modificar literais de seqüência de caracteres e outros dados globais constantes.Ao trabalhar com outros programadores em projetos grandes, o uso
const
adequado ajuda a impedir que outros programadores o estrangulem.fonte
const
ajuda a isolar o código que "muda as coisas" pelas suas costas. Portanto, em uma classe, você marcaria todos os métodos que não alteram o estado do objeto comoconst
. Isso significa queconst
instâncias dessa classe não poderão mais chamar nenhum nãoconst
método. Dessa forma, você é impedido de chamar acidentalmente funcionalidades que podem alterar seu objeto.Além disso,
const
faz parte do mecanismo de sobrecarga, portanto, você pode ter dois métodos com assinaturas idênticas, mas um comconst
e um sem. Aquele comconst
é chamado paraconst
referências e o outro é chamado para não-const
referências.Exemplo:
fonte
A correção constante é uma daquelas coisas que realmente precisam estar em vigor desde o início. Como você descobriu, é muito difícil incluí-lo mais tarde, especialmente quando há muita dependência entre as novas funções que você está adicionando e as funções antigas que não estão corretas, que já existem.
Em grande parte do código que escrevo, realmente valeu a pena o esforço, porque costumamos usar muito a composição:
Se não tivéssemos correção constante, você teria que recorrer a objetos complexos por valor para garantir a si mesmo que ninguém estava manipulando o estado interno da classe B pelas suas costas.
Em resumo, a correção constante é um mecanismo de programação defensivo para se livrar da dor no caminho.
fonte
Digamos que você tenha uma variável em Python. Você sabe que não deveria modificá-lo. E se você acidentalmente fizer?
O C ++ oferece uma maneira de se proteger acidentalmente de fazer algo que você não deveria poder fazer em primeiro lugar. Tecnicamente, você pode contorná-lo de qualquer maneira, mas precisa fazer um trabalho extra para se matar.
fonte
Há um bom artigo aqui sobre const em c ++. É uma opinião bastante direta, mas espero que ajude alguns.
fonte
Quando você usa a palavra-chave "const", está especificando outra interface para suas classes. Existe uma interface que inclui todos os métodos e uma interface que inclui apenas os métodos const. Obviamente, isso permite restringir o acesso a algumas coisas que você não deseja que sejam alteradas.
Sim, fica mais fácil com o tempo.
fonte
Eu gosto de const constance ... em teoria. Sempre que tentei aplicá-lo rigorosamente na prática, ele acabou se deteriorando e o const_cast começa a se tornar cada vez mais feio.
Talvez sejam apenas os padrões de design que eu uso, mas o const sempre acaba sendo um pincel muito amplo.
Por exemplo, imagine um mecanismo de banco de dados simples ... ele possui objetos de esquema, tabelas, campos etc. os dados associados à tabela? Se o método Insert () estiver marcado como const, internamente, ele deverá eliminar a constância para realmente manipular o banco de dados. Se não estiver marcado const, não será protegido contra a chamada do método AddField.
Talvez a resposta seja dividir a classe com base nos requisitos de constância, mas isso tende a complicar o design mais do que eu gostaria pelo benefício que ele traz.
fonte
Você pode dar dicas ao compilador com const também .... conforme o código a seguir
fonte