const (C++)

Ao modificar uma declaração de dados, a palavra-chave const especifica que o objeto ou a variável não é modificável.

Sintaxe

declarator:
ptr-declarator
noptr-declarator parameters-and-qualifiers trailing-return-type
ptr-declarator:
noptr-declarator
ptr-operator ptr-declarator
noptr-declarator:
declarator-idattribute-specifier-seqopt
noptr-declarator parameters-and-qualifiers
noptr-declarator[constant-expressionopt]attribute-specifier-seqopt
( ptr-declarator )
parameters-and-qualifiers:
(parameter-declaration-clause)cv-qualifier-seqopt
ref-qualifieroptnoexcept-specifieroptattribute-specifier-seqopt
trailing-return-type:
-> type-id
ptr-operator:
*attribute-specifier-seqoptcv-qualifier-seqopt
&attribute-specifier-seqopt
&&attribute-specifier-seqopt
nested-name-specifier*attribute-specifier-seqoptcv-qualifier-seqopt
cv-qualifier-seq:
cv-qualifiercv-qualifier-seqopt
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
...optid-expression

Valores const

A palavra-chave const especifica que um valor de variável é constante e informa o compilador para impedir que o programador a modifique.

// constant_values1.cpp
int main() {
   const int i = 5;
   i = 10;   // C3892
   i++;   // C2105
}

Em C++, você pode usar a palavra-chave const em vez de política de pré-processador #define para definir valores constantes. Os valores definidos com const estão sujeitos à verificação de tipo e podem ser usados no lugar de expressões constantes. Em C++, você pode especificar o tamanho de uma matriz com uma variável const como a seguir:

// constant_values2.cpp
// compile with: /c
const int maxarray = 255;
char store_char[maxarray];  // allowed in C++; not allowed in C

Em C, os valores constantes usam como padrão o vínculo externo, assim eles podem aparecer somente em arquivos de origem. Em C++, os valores constantes usam como padrão o vínculo interno, que permite que eles apareçam em arquivos de cabeçalho.

A palavra-chave const também pode ser usada em declarações de ponteiro.

// constant_values3.cpp
int main() {
   char this_char{'a'}, that_char{'b'};
   char *mybuf = &this_char, *yourbuf = &that_char;
   char *const aptr = mybuf;
   *aptr = 'c';   // OK
   aptr = yourbuf;   // C3892
}

Um ponteiro para uma variável declarada como const pode ser atribuído a um ponteiro que é declarado também como const.

// constant_values4.cpp
#include <stdio.h>
int main() {
   const char *mybuf = "test";
   char *yourbuf = "test2";
   printf_s("%s\n", mybuf);

   const char *bptr = mybuf;   // Pointer to constant data
   printf_s("%s\n", bptr);

   // *bptr = 'a';   // Error
}

Você pode usar ponteiros para os dados constantes como parâmetros de função para evitar que a função modifique um parâmetro passado por um ponteiro.

Para os objetos declarados como const, você poderá chamar apenas funções de membro constantes. O compilador assegura que o objeto constante nunca seja modificado.

birthday.getMonth();    // Okay
birthday.setMonth( 4 ); // Error

Você pode chamar funções membro constantes ou não constantes para um objeto não constante. Você também pode sobrecarregar uma função membro usando a palavra-chave const; isso permite que uma versão diferente da função seja chamada para objetos constantes e não constantes.

Você não pode declarar construtores ou destruidores com a palavra-chave const.

const Funções de membro

A declaração de uma função membro com a palavra-chaveconst especifica que aquela é uma função “somente leitura” que não modifica o objeto para o qual é chamada. Uma função membro constante não pode alterar membros de dados não estáticos ou chamar qualquer função membro que não seja uma constante. Para declarar uma função membro como constante, coloque a palavra-chave const depois do parêntese de fechamento da lista de argumentos. A palavra-chave const é necessária na declaração e na definição.

// constant_member_function.cpp
class Date
{
public:
   Date( int mn, int dy, int yr );
   int getMonth() const;     // A read-only function
   void setMonth( int mn );   // A write function; can't be const
private:
   int month;
};

int Date::getMonth() const
{
   return month;        // Doesn't modify anything
}
void Date::setMonth( int mn )
{
   month = mn;          // Modifies data member
}
int main()
{
   Date MyDate( 7, 4, 1998 );
   const Date BirthDate( 1, 18, 1953 );
   MyDate.setMonth( 4 );    // Okay
   BirthDate.getMonth();    // Okay
   BirthDate.setMonth( 4 ); // C2662 Error
}

Diferenças de C e C++ const

Ao definir uma const variável em um arquivo de código-fonte C, você faz isso como:

const int i = 2;

Então, você pode usar essa variável em outro módulo como segue:

extern const int i;

Mas para obter o mesmo comportamento em C++, você deve definir sua const variável como:

extern const int i = 2;

Semelhante ao C, você pode usar essa variável em outro módulo da seguinte maneira:

extern const int i;

Se você deseja definir uma extern variável em um arquivo de código-fonte C++ para uso em um arquivo de código-fonte C, use:

extern "C" const int x=10;

para evitar a desconfiguração do nome pelo compilador C++.

Comentários

Após a lista de parâmetros de uma função membro, a palavra-chave const especifica que a função não modifica o objeto para o qual é chamada.

Para obter mais informações em const, confira os seguintes artigos:

Confira também

Palavras-chave