const (C++)

Cuando se modifica una declaración de datos, la palabra clave const especifica que el objeto o la variable no se puede modificar.

Sintaxis

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

La palabra clave const especifica que el valor de una variable es constante e indica al compilador que evite que el programador lo modifique.

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

En C++, se puede usar la palabra clave const en lugar de la directiva de preprocesador #define para definir valores constantes. Los valores definidos con const están sujetos a la comprobación de tipos y se pueden usar en lugar de expresiones constantes. En C++, puede especificar el tamaño de una matriz con una variable const de la forma siguiente:

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

En C, los valores constantes tienen la vinculación externa como valor predeterminado, por lo que solo pueden aparecer en los archivos de código fuente. En C++, los valores constantes tienen la vinculación interna como valor predeterminado, que permite que aparezcan en los archivos de encabezado.

La palabra clave const también se puede usar en las declaraciones de puntero.

// 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
}

Un puntero a una variable declarada como const solo se puede asignar a un puntero que también se declare 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
}

Puede utilizar punteros a datos constantes como parámetros de función para evitar que la función modifique un parámetro pasado a través de un puntero.

Para los objetos que se declaran como const, solo se puede llamar a las funciones miembro constante. El compilador garantiza que el objeto constante nunca se modifique.

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

Se puede llamar a funciones miembro constante o no constante para un objeto que no es constante. Una función miembro también se puede sobrecargar mediante la palabra clave const; esta característica permite que se llame a una versión diferente de la función para los objetos constante y que no son constante.

Los constructores o destructores no se pueden declarar con la palabra clave const.

Funciones miembro const

Declarar una función miembro con la palabra clave const indica que la función es una función de "solo lectura" que no modifica el objeto para el que se llama. Una función miembro constante no puede modificar los miembros de datos no estáticos ni llamar a funciones miembro que no sean constante. Para declarar una función miembro constante, coloque la palabra clave const después del paréntesis de cierre de la lista de argumentos. La palabra clave const se requiere tanto en la declaración como en la definición.

// 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
}

Diferencias de const en C y C++

Al definir una const variable en un archivo de código fuente de C, haga lo siguiente:

const int i = 2;

A continuación, esta variable se puede utilizar en otro módulo como sigue:

extern const int i;

Pero para obtener el mismo comportamiento en C++, debe definir la const variable como:

extern const int i = 2;

De forma similar a C, puede usar esta variable en otro módulo de la siguiente manera:

extern const int i;

Si desea definir una extern variable en un archivo de código fuente de C++ para su uso en un archivo de código fuente de C, use:

extern "C" const int x=10;

para evitar que el compilador de C++ elimine nombres.

Comentarios

Cuando va después de la lista de parámetros de una función miembro, la palabra clave const especifica que la función no modifica el objeto para el que se invoca.

Para más información sobre const, consulte los artículos siguientes:

Consulte también

Palabras clave