Considerar:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
Essas duas funções são iguais em todos os aspectos ou há uma diferença?
Estou interessado em uma resposta para a linguagem C, mas se houver algo interessante na linguagem C ++, gostaria de saber também.
Respostas:
const T
eT const
são idênticos. Com os tipos de ponteiro, fica mais complicado:const char*
é um ponteiro para uma constantechar
char const*
é um ponteiro para uma constantechar
char* const
é um ponteiro constante para um (mutável)char
Em outras palavras, (1) e (2) são idênticos. A única maneira de fazer a ponta (em vez da ponta)
const
é usar um sufixo-const
.É por isso que muitas pessoas preferem sempre colocar
const
do lado direito do tipo (estilo "Const do Leste"): isso torna sua localização em relação ao tipo consistente e fácil de lembrar (também anedoticamente parece tornar mais fácil de ensinar para iniciantes )fonte
O truque é ler a declaração de trás para frente (da direita para a esquerda):
Ambos são a mesma coisa. Portanto:
O truque da leitura reversa é especialmente útil quando você está lidando com declarações mais complexas, como:
fonte
char const *
, lido da esquerda para a direita é: "ponteiro, const, char". É um ponteiro para const char. Quando você diz "um ponteiro que é constante", o adjetivo "constante" está no ponteiro. Então, para esse caso, sua lista de adjetivos deveria ser: "const, pointer, char". Mas você está certo, esse truque é ambíguo. É realmente um "truque", mais do que uma "regra" definitiva.Não há diferença. Ambos declaram que "a" é um número inteiro que não pode ser alterado.
O lugar onde as diferenças começam a aparecer é quando você usa ponteiros.
Ambos estes:
declare "a" como um ponteiro para um inteiro que não muda. "a" pode ser atribuído, mas "* a" não.
declara "a" como um ponteiro constante para um inteiro. "* a" pode ser atribuído, mas "a" não.
declara "a" como um ponteiro constante para um número inteiro constante. Nem "a" nem "* a" podem ser atribuídos.
fonte
Prakash está correto ao dizer que as declarações são as mesmas, embora um pouco mais de explicação sobre o caso do ponteiro possa ser necessário.
"const int * p" é um ponteiro para um int que não permite que o int seja alterado por meio desse ponteiro. "int * const p" é um ponteiro para um int que não pode ser alterado para apontar para outro int.
Consulte https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const .
fonte
const int
é idêntico aint const
, como é verdadeiro com todos os tipos escalares em C. Em geral, declarar um parâmetro de função escalar comoconst
não é necessário, uma vez que a semântica de chamada por valor de C significa que quaisquer alterações na variável são locais para sua função envolvente.fonte
Esta não é uma resposta direta, mas uma dica relacionada. Para manter as coisas retas, sempre uso a convecção "colocar
const
do lado de fora", onde por "fora" quero dizer extrema esquerda ou extrema direita. Dessa forma, não há confusão - a const se aplica à coisa mais próxima (o tipo ou o*
). Por exemplo,fonte
Eles são iguais, mas em C ++ há um bom motivo para sempre usar const à direita. Você será consistente em todos os lugares porque as funções-membro const devem ser declaradas desta forma:
Ele muda o
this
ponteiro na função deFoo * const
paraFoo const * const
. Veja aqui.fonte
Sim, eles são iguais por apenas
int
e diferente para
int*
fonte
Acho que, neste caso, são iguais, mas aqui está um exemplo em que a ordem é importante:
fonte