Qual é a diferença entre variável estática e constante?
O que a estática faz para as variáveis é atribuir-lhes um endereço estático (não alterável) na memória. Isto significa que a menos que o valor da variável'seja explicitamente alterado, ela terá o mesmo valor, não importa o que mais você'esteja fazendo no seu código. It's é uma "classe" de armazenamento, juntamente com variáveis "automáticas", que é memória temporária que reside na pilha, e memória que's armazenada na pilha. Cada classe de armazenamento comporta-se de forma diferente.
I'já vi casos em que é útil usar variáveis estáticas dentro de funções. O que a função faz para a variável é fornecer um escopo para sua visibilidade, não para sua vida útil (como com as variáveis locais automáticas). O código fora da função não pode acessar uma variável estática local. Isso efetivamente permite que a função mantenha o estado entre os momentos em que ela's é chamada. Para ver isso em ação, dê uma olhada na função da biblioteca padrão strtok().
Constants pode ser atribuído um valor apenas uma vez, e elas devem ser inicializadas para um valor quando são declaradas (exceto se we're falando sobre parâmetros constantes C++ e tipos de retorno em funções). They're como um enum singular, exceto que they're não são capazes de ter um tipo enum (they're apenas o tipo com que eles're declarados, como "const int"). Em todos os outros aspectos, eles se comportam como variáveis. Se eles're declarados dentro de uma função, eles saem do escopo quando a função sai. O mesmo para parâmetros const. Ao contrário da estática, const não é uma classe de armazenamento. It'é efetivamente um flag para o compilador dizendo-lhe, "Este identificador só pode ser inicializado para um valor, e nunca mais mudado"
Como mencionei, o designador de constantes em C++ pode ser usado com parâmetros e tipos de retorno em funções (static não pode, por definição, já que todos os parâmetros e valores de retorno são passados na pilha). No caso de um parâmetro, ele evita que o parâmetro seja alterado dentro da função. No caso de um valor de retorno, impede que o valor retornado seja alterado pelo chamador. Dependendo do parâmetro/tipo de retorno, ele pode ter alguns significados diferentes. Se um parâmetro/tipo de retorno for declarado const char *, ele evita que o ponteiro seja alterado (por exemplo, se algum código tentar obter o endereço do ponteiro, e alterá-lo, ou se tentar incrementá-lo/decrementá-lo). No entanto, char const * impede que o valor para o qual o ponteiro aponta seja alterado, mas permite que o ponteiro seja alterado. It's é possível fazer ambas: const char const *, neste caso o código não pode alterar o ponteiro, e não pode alterar o valor para o qual ele aponta. No caso dos parâmetros const, no que diz respeito ao chamador, não importaria se a função alterasse o ponteiro de entrada, uma vez que todos os parâmetros são de valor passante, e no nível do chamador's, o valor do ponteiro's permaneceria inalterado, não importa o quê. Entretanto, poderia importar se o valor que aponta fosse alterado pela função, já que apenas o ponteiro é passado pelo valor. Onde a declaração de parâmetro const char *, por exemplo, é (acho que) necessária é se você're tentar passar um array literalmente para uma função, tal como, SomeFn("Hello world.");
As mesmas regras para const também se aplicam a aliases, incluindo aliased parameters.
Artigos semelhantes
- Qual é a diferença entre um Autocodificador Variável (VAE) e um Autocodificador?
- É normal que um alto-falante JBL tenha um pouco de estática quando está ligado e não há música tocando através dele?
- Digital Signage: Como posso evitar o "burn-in" da tela em um display com uma imagem estática?
- Na Unidade 3d, como posso decidir que variável devo manter como Pública, Protegida ou Interna?