Compartilhar via


const (C++)

Quando modifica uma declaração de dados, a const palavra-chave especifica que o objeto ou 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-id attribute-specifier-seq optar
noptr-declarator parameters-and-qualifiers
noptr-declarator [ constant-expression optar]attribute-specifier-seqoptar
( ptr-declarator )
parameters-and-qualifiers:
( parameter-declaration-clause ) cv-qualifier-seq optar
ref-qualifier optarnoexcept-specifieroptarattribute-specifier-seqoptar
trailing-return-type:
-> type-id
ptr-operator:
* attribute-specifier-seq optarcv-qualifier-seqoptar
& attribute-specifier-seq optar
&& attribute-specifier-seq optar
nested-name-specifier * attribute-specifier-seq optarcv-qualifier-seqoptar
cv-qualifier-seq:
cv-qualifier cv-qualifier-seq optar
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
... optarid-expression

valores const

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

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

No C++, você pode usar a const palavra-chave em vez da diretiva de #define pré-processador 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. No C++, você pode especificar o tamanho de uma matriz com uma const variável da seguinte maneira:

// 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 são padrão para a vinculação externa, para que possam aparecer apenas em arquivos de origem. No C++, os valores constantes são padrão para a vinculação interna, o que permite que eles apareçam em arquivos de cabeçalho.

A const palavra-chave 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 apenas a um ponteiro que também é declarado 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 dados constantes como parâmetros de função para impedir que a função modifique um parâmetro passado por um ponteiro.

Para objetos declarados como const, você só pode chamar funções de membro constante. O compilador garante que o objeto constante nunca seja modificado.

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

Você pode chamar funções de membro constantes ou não constantes para um objeto não constante. Você também pode sobrecarregar uma função membro usando a const palavra-chave; esse recurso 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 const palavra-chave.

const funções de membro

Declarar uma função membro com a const palavra-chave especifica que a função é uma função "somente leitura" que não modifica o objeto para o qual ela é chamada. Uma função membro constante não pode modificar membros de dados não estáticos ou chamar quaisquer funções membro que não sejam constantes. Para declarar uma função de membro constante, coloque a const palavra-chave após o parêntese de fechamento da lista de argumentos. A const palavra-chave é necessária tanto na declaração quanto 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, faça isso como:

const int i = 2;

Em seguida, você pode usar essa variável em outro módulo da seguinte maneira:

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 a C, você pode usar essa variável em outro módulo da seguinte maneira:

extern const int i;

Se você quiser 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 impedir o mangling de nome pelo compilador C++.

Observações

Ao seguir a lista de parâmetros de uma função membro, a const palavra-chave especifica que a função não modifica o objeto para o qual ela é invocada.

Para obter mais informações sobre const, consulte os seguintes artigos:

Consulte também

Palavras-chave