terça-feira, 30 de janeiro de 2007

Dica C++: Onde constará o const ?

Olhe para este código:

 

char nome[] = "Mickey Mouse";

const char *pc = nome;

char *const cp = nome;

const char *const cpc = nome;

 

Sabe dizer ao certo o que as três últimas constantes declaradas significam, na prática ?

Uma dica: tenta lê-las da direita para esquerda.

Nos casos exemplificados, fica:

  • const char *pc pode ser lido como "pc é um ponteiro para um caractere constante".
  • char* const cp pode ser lido como "cp é um ponteiro constante para um caractere".
  • const char* const cpc pode ser lido como "cpc é um ponteiro constante para um caractere constante".

Vamos a explicação sintática, pra clarear mais o significado:

  • Colocando const antes de um ponteiro (*), você torna o objeto constante - e não o ponteiro. (Ex: const char *pc faz o valor do caracterer ser constante, não o ponteiro.)
  • Para o ponteiro ser constante, use *const.
  • Não existe const*.

Mas ora bolas - você pode estar perguntando - para que serve um objeto constante ? E para que um ponteiro constante ?

Sua utilidade principal é em parâmetros de funções. Quando você declara um objeto constante, ele não pode ser modificado pela função. Logo, como a função fica proibida de modificar o objeto, você tem a garantia que o objeto passado por parâmetro ficou intacto após ser manipulado pela mesma. Ex.:

void Imprimir(const char *linha);

(No exemplo, linha não poderá ser modificada pela função pois ela é uma constante.)

Já um ponteiro constante garante que o ponteiro não apontará para mais nenhum objeto além do que foi inicializado. Ex.:

 

int a = 10, b = 20, c = 30;
int *pa = &a;
int *const pb = &b;

*pa = 50; // OK - pode mudar o valor
*pb = 90; // OK - pode mudar o valor

pa = &c; // OK - pa pode apontar para outro
pb = &a; // ERRO - pb só pode apontar para b

 

Bem aplicado, isto pode auxiliar a evitar erros no código.

Veja o caso de acima introduzirmos um ponteiro constante para uma constante:

 

const int *const pc = &c;

*pc = 70; // ERRO - nao pode mudar o valor
pc = &a; // ERRO - nao pode apontar para outro

 

(Nem o valor do objeto apontado nem o objeto apontado podem mudar.)

Coisas assim, são úteis para tornar nosso código menos propenso a erros (limitando possibilidades de atribuições incorretas), evitando maiores dores de cabeça na hora da depuração.

Nenhum comentário: