Pregunta Declaración puntero C ++ Const


Estoy revisando un código y encontré un 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.

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

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


16
2018-03-19 23:39


origen


Respuestas:


Significa "myPtr es un const puntero a un const  myClass". Significa que no puedes modificar a qué apunta el puntero a través de este puntero ni puedes hacer que el puntero apunte a otro lado después de que se inicializa (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 una const objeto (por lo que usted sabe, realmente podría ser no-const debajo).

Recuerda eso const se aplica al elemento a su izquierda (o si no hay un elemento a la izquierda, el elemento a su derecha). El primero const hacer el myClass  const (donde no se puede modificar lo que señala el puntero) y el segundo const hacer el * const (donde no se puede modificar el puntero).


25
2018-03-19 23:41



En algunos casos, puede verlo escrito así:

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

Los dos son equivalentes, a saber, un puntero constante a un objeto constante. Prefiero la sintaxis tal como la has mostrado porque es más fácil de entender para los novatos 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 

19
2018-03-19 23:49



La regla es que el const palabra clave se aplica a la "palabra" a la izquierda de la misma, 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. Asi que: myClass const * const: myClass <- const, puntero <- const, const pointer para const myClass.

Por alguna razón, en la mayoría del código (al menos el que he visto), esto sería declarado 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.


3
2018-03-19 23:48



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


1
2018-03-19 23:42



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


1
2018-03-19 23:47



El primero const es un uso válido mientras que el segundo const es IMO superfluo

Cuando usas

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

No puedes cambiar el objeto que myPtr puntos a.
No puedes cambiar donde myPtr apunta a cualquiera.

myPtr->SomeMember = SomeValue; // Not allowed. That's OK.
                               // The state of myClass is protected.

myPtr = nullptr; // That's not allowed either.
                 // I don't think it is necessary to disallow this.

Deberías poder usar

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

sin ningún daño


0
2017-07-25 18:27