¿Cuál es la diferencia entrediferencia entre las declaraciones const en C++
void func(const Class *myClass)
y
void func(Class *const myClass)
Ver también:
y probablemente otros ...
¿Cuál es la diferencia entrediferencia entre las declaraciones const en C++
void func(const Class *myClass)
y
void func(Class *const myClass)
Ver también:
y probablemente otros ...
La diferencia es que para
void func(const Class *myClass)
Usted señala a una clase que no se puede cambiar porque es const. pero puede modificar el puntero myClass (dejar que apunte a otra clase, lo que no tiene ningún efecto secundario a la persona que llama, porque es puntero se copia, sólo cambia su local de la copia del puntero) En contraste
void func(Class *const myClass)
Ahora myClass apunta a una clase que se puede modificar mientras no se puede cambiar el parámetro.
En la primera declara una función que acepta un puntero a un objeto de Clase constante. No puede modificar el objeto dentro de la función. En el segundo, declara una función que acepta un puntero constante a un objeto de clase no constante. Puede modificar el objeto a través del puntero, pero no puede modificar el valor del puntero.
Siempre tengo en cuenta esta regla fácil: const
siempre se aplica en la cosa a la izquierda inmediata, si esto no existe, se aplica a la cosa a la derecha inmediata.
También eche un vistazo a la pregunta this que le pregunté hace una semana, apunta a algunos enlaces muy útiles para comprender la exactitud const.
En C++ esta
const MyClass *ptr
y esto
MyClass const *ptr
ambos significan que ptr
es un puntero variable de que apunta a una constante objeto de tipo MyClass
. Es decir, no puede cambiar dicho objeto a través del ptr
. Sin embargo, puede hacer que ptr
señale algún otro objeto de MyClass
.
Por el contrario, este
MyClass *const ptr
implica ptr
es una constante que apunta puntero a una variableMyClass
objeto . Aquí puede cambiar el objeto al que apunta ptr, pero no puede hacer que ptr
apunte a algún otro objeto.
Tenga en cuenta que, entre los tres tipos anteriores de sintaxis, el segundo es un poco extraño, pero es una sintaxis válida. No sigue la regla de lectura de izquierda a derecha que otras personas han sugerido. Pero entonces, esa es la vida en C++ para ti.
Una regla de oro es leer las declaraciones de derecha a izquierda:
void func(const Class *myClass)
es un puntero a una clase const (o en sentido estricto "un puntero a una clase que es const")
void func(Class *const myClass)
es un puntero constante a una clase
para definiciones muy sueltas de derecha-> izquierda.Estrictamente, el primero parece más como 'puntero a una clase const' para mí –
Esta regla se rompe al ver esto: MyClass const * ptr –
drhorrible: "una clase que es const", entonces, si quieres ser pedante. ;) Frederick: ¿Por qué? Un puntero a un const MyClass? Parece sencillo. – jalf
El truco es leer cosas theese revés:
void func(const Class *myClass)
lee "myClass es un puntero a una clase que se const" wich significa que no puedo hacer cambios en la clase
void func(Class *const myClass)
lee "myClass es un puntero constante a una clase" significa wich puedo' t cambiar el puntero.
void func(const Class *myClass) { //...
Como se ha mencionado en otras respuestas, esta definición significa que el parámetro myClass
puntos a una instancia de Class
que no puede ser modificado (mutable
y const_cast
exceptuados) por la función. Sin embargo, la variable myClass
en el cuerpo de la función podría cambiarse para apuntar a una instancia diferente de Class
. Este es un detalle de implementación de la función.
void func(Class *const myClass) { // ...
Por otra parte esta definición significa que el parámetro myClass
es un puntero a una instancia de Class
que no está const y por lo tanto puede ser utilizado por la función de manipular totalmente la instancia de clase, pero que la variable myClass
puntero en sí mismo no puede ser alterado para apuntar a cualquier otra cosa en el cuerpo de la función.
Un punto importante que no ha sido planteado por otras respuestas es que para las firmas de funciones, cualquier const de nivel superior o cualificación volátil se descarta al considerar el tipo de función. Esto se debe a que los parámetros siempre se pasan por valor, por lo tanto, si son const o no solo afectan si el parámetro en sí mismo puede cambiarse en el cuerpo de la función y no puede afectar a la persona que llama.
Por lo tanto, estas declaraciones de dos funciones son equivalentes.
void func(Class *const myClass);
void func(Class *myClass);
+1 para una buena respuesta y la sugerencia sobre cómo recordar la const-ness, esa es la que uso también. – xan