2012-03-19 13 views
16

Estoy revisando algunos códigos y encontré algún código con el que no estoy familiarizado. Después de algunas búsquedas, no pude encontrar ningún ejemplo de por qué se hace esto o el beneficio de esta declaración.C++ Declaración de puntero de Const

myClass const * const myPtr = myClass->getPointer(); 

¿Es esto una declaración de un puntero const o algo completamente diferente?

Respuesta

24

Significa que "myPtr es un puntero const a constmyClass". Significa que no puede modificar a qué apunta el puntero en a través de este puntero ni puede hacer que el puntero apunte a otro lugar después de inicializado (por el valor de retorno de myClass->getPointer()). Así que sí, básicamente tienes razón, con la adición de que también apunta a un objeto const (hasta donde sabes, realmente podría ser no const debajo).

Recuerde que const se aplica al artículo a su izquierda (o si no hay ningún elemento a su izquierda, el elemento a su derecha). El primer const hace el myClassconst (donde no se puede modificar lo que señala el puntero) y el segundo const hace el * const (donde no se puede modificar el puntero).

+6

"Recuerde que const se aplica al elemento a su izquierda (o si no hay ningún elemento a su izquierda, el elemento a su derecha). "- esta es la mejor regla, más simple, más fácil que he visto en la clasificación de const. – linbianxiaocao

1

Esto declara un puntero constante a un valor constante, devuelto por la llamada a la función miembro de una referencia de puntero myClass

2

Seth está en el dinero. Hay más antecedentes que puede encontrar útiles en Duramecho también.

3

La regla es que la palabra clave const se aplica a la "palabra" a la izquierda, a menos que sea la primera palabra en la línea, en cuyo caso se aplica a la "palabra" a la derecha de la misma. Entonces: myClass const * const: myClass < - const, puntero < - const, const puntero a const myClass.

Por alguna razón, en la mayoría del código (al menos el que he visto), esto se declararía como const myClass * const. Por qué no tengo idea, porque ahora tiene que aceptar la excepción a "const se aplica a la palabra de la izquierda, a menos que sea la primera palabra en la línea" en la cuenta. Es decir: escribir líneas de la forma en que se hace el código que está revisando es mucho más claro.

17

En algunos casos, es posible que vea que escribe así:

const myClass * const myPtr = myClass->getPointer(); 

Los dos son equivalentes, es decir, un puntero constante a un objeto constante. Yo prefiero la sintaxis que usted ha demostrado que debido a que es más fácil de entender para los principiantes cuando se lee de derecha a izquierda:

Object * const obj;  // read right-to-left: const pointer to Object 
Object const * obj;  // read right-to-left: pointer to const Object 
Object const * const obj; // read right-to-left: const pointer to const Object 
Cuestiones relacionadas