¿Qué son los clasificadores const de nivel superior?

¿Qué significa const en calificador de “nivel superior” en C ++?

¿Y qué son los otros niveles?

Por ejemplo:

 int const *i; int *const i; int const *const i; 

Un calificador const de nivel superior afecta al objeto en sí. Otros solo son relevantes con punteros y referencias. No hacen que el objeto sea const, y solo previene la modificación a través de una ruta utilizando el puntero o la referencia. Así:

 char x; char const* p = &x; 

Este no es un const de nivel superior, y ninguno de los objetos es inmutable. La expresión *p no se puede usar para modificar x , pero otras expresiones pueden ser; x no es const Para esa materia

 *const_cast( p ) = 't' 

es legal y bien definido.

Pero

 char const x = 't'; char const* p = &x; 

Esta vez, hay una const de nivel superior en x , por lo que x es inmutable. No se permite que ninguna expresión lo modifique (incluso si se usa const_cast ). El comstackdor puede poner x en la memoria de solo lectura, y puede suponer que el valor de x nunca cambia, independientemente de lo que otro código pueda hacer.

Para darle al puntero const nivel superior, escribiría:

 char x = 't'; char *const p = &x; 

En este caso, p apuntará a x para siempre; cualquier bash de cambiar esto es un comportamiento indefinido (y el comstackdor puede poner p en la memoria de solo lectura, o asumir que *p refiere a x , independientemente de cualquier otro código).

int *const i pone const en el nivel superior, mientras que int const *i no.

El primero dice que el puntero i mismo es inmutable, mientras que el segundo dice que la memoria a la que apunta el puntero es inmutable.

Siempre que const aparezca inmediatamente antes o después del tipo del identificador, se considera un calificador de nivel superior.

La forma en que me lo explicaron, dado:

 [const] TYPE * [const] VARIABLE 

VARIABLE se utiliza para apuntar a datos de tipo TYPE a través de *VARIABLE

Dibuja una línea a través de * o múltiplos * s

  1. Si hay un const a la izquierda del * se aplica a los datos y los datos no se pueden cambiar: *VARIABLE no se puede asignar, excepto en la inicialización
  2. Si hay una const a la derecha de * se aplica a la VARIABLE y los puntos de la VARIABLE no se pueden cambiar: VARIABLE no se puede asignar, excepto en la inicialización

Asi que:

  | left right int * i1; | no no can change *i1 and i1 int const * i2; | yes no cannot change *i2 but can change i2 int * const i3; | no yes can change *i3 but i3 cannot be changed int const * const i4; | yes yes cannot change *i4 or i4 

Los dos niveles de const son: * Const de bajo nivel * Const de nivel superior

Debería mirar const de nivel superior y bajo a través de referencias y punteros, porque aquí es donde son relevantes.

 int i = 0; int *p = &i; int *const cp = &i; const int *pc = &i; const int *const cpc = &i; 

En el código anterior, hay 4 declaraciones de puntero diferentes. Repasemos cada uno de estos,

int *p : El puntero normal se puede usar para realizar cambios en el objeto subyacente y se puede reasignar.

int *cp (const de nivel superior): Const Pointer se puede usar para realizar cambios en el objeto subyacente pero no se puede reasignar. (No se puede cambiar para señalar a otro objeto).

const int *pc (const de bajo nivel): el puntero a Const no se puede usar para realizar cambios en el objeto subyacente, pero sí se puede reasignar.

const int *const cpc ( const int *const cpc nivel superior y bajo): Const Pointer a un Const no se puede utilizar para realizar cambios en el objeto subyacente ni se puede reasignar.

Además, const de nivel superior siempre se ignora cuando se asigna a otro objeto, mientras que const de bajo nivel no se ignora.

 int i = 0; const int *pc = &i; int *const cp = &i; int *p1 = cp; // allowed int *p2 = pc; // error, pc has type const int* 

Espero que esto haya ayudado 🙂 FYI: ¡C ++ Primer tiene mucha información sobre lo mismo!