Como programador iniciante em C ++, existem algumas construções que ainda parecem muito obscuras para mim, uma delas é const
. Você pode usá-lo em tantos lugares e com tantos efeitos diferentes que é quase impossível para um iniciante sair vivo. Algum guru de C ++ explicará uma vez para sempre os vários usos e se e / ou por que não usá-los?
129
Respostas:
Tentando coletar alguns usos:
Vinculando alguns temporários à referência à const, para prolongar sua vida útil. A referência pode ser uma base - e o destruidor dela não precisa ser virtual - o destruidor certo ainda é chamado:
Explicação , usando o código:
Esse truque é usado na classe de utilitário ScopeGuard do Alexandrescu. Depois que o temporário fica fora do escopo, o destruidor de Derivado é chamado corretamente. O código acima perde alguns pequenos detalhes, mas esse é o grande problema.
Use const para dizer aos outros que os métodos não mudarão o estado lógico desse objeto.
Use const para copiar-na-gravar classes , para fazer o compilador ajudá-lo a decidir quando e quando você não precisa copiar.
Explicação : Você pode compartilhar dados quando copiar algo, desde que os dados do objeto original e do objeto copiado permaneçam os mesmos. Depois que um dos objetos altera os dados, você precisa agora de duas versões: uma para o original e outra para a cópia. Ou seja, você copia em uma gravação para qualquer um dos objetos, para que agora ambos tenham sua própria versão.
Usando código :
O trecho acima imprime o mesmo endereço no meu GCC, porque a biblioteca C ++ usada implementa uma cópia na gravação
std::string
. As duas cadeias, mesmo que sejam objetos distintos, compartilham a mesma memória para seus dados. Tornarb
não-const preferirá a versão não-const dooperator[]
e o GCC criará uma cópia do buffer de memória de backup, porque podemos alterá-lo e não deve afetar os dados dea
!Para que o construtor de cópias faça cópias de objetos const e temporários :
Por fazer constantes que trivialmente não podem mudar
Para passar objetos arbitrários por referência em vez de por valor - para impedir a passagem por valor possivelmente cara ou impossível
fonte
Existem realmente 2 usos principais de const em C ++.
Valores Const
Se um valor estiver na forma de uma variável, membro ou parâmetro que não será (ou não deveria) ser alterado durante sua vida útil, marque-o como const. Isso ajuda a evitar mutações no objeto. Por exemplo, na função a seguir, não preciso alterar a instância do Student aprovada, marcando-a como const.
Por que você faria isso. É muito mais fácil argumentar sobre um algoritmo se você souber que os dados subjacentes não podem mudar. "const" ajuda, mas não garante que isso será alcançado.
Obviamente, imprimir dados para cout não requer muita reflexão :)
Marcando um método de membro como const
No exemplo anterior, marquei Student como const. Mas como o C ++ sabia que chamar o método GetName () no aluno não mudaria o objeto? A resposta é que o método foi marcado como const.
A marcação de um método "const" faz duas coisas. Principalmente, ele diz ao C ++ que esse método não muda o meu objeto. A segunda coisa é que todas as variáveis de membro agora serão tratadas como se fossem marcadas como const. Isso ajuda, mas não impede que você modifique a instância da sua classe.
Este é um exemplo extremamente simples, mas espero que ajude a responder suas perguntas.
fonte
Tome cuidado para entender a diferença entre estas 4 declarações:
As 2 declarações a seguir são idênticas semanticamente. Você pode mudar para onde ccp1 e ccp2 apontam, mas não pode mudar para o que eles apontam.
Em seguida, o ponteiro é const; portanto, para ser significativo, ele deve ser inicializado para apontar para alguma coisa. Você não pode apontar para outra coisa, no entanto, a coisa para a qual aponta pode ser alterada.
Finalmente, combinamos os dois - para que a coisa apontada não possa ser modificada e o ponteiro não possa apontar para outro lugar.
A regra espiral no sentido horário pode ajudar a desembaraçar uma declaração http://c-faq.com/decl/spiral.anderson.html
fonte
Como uma pequena nota, como li aqui , é útil notar que
fonte