diferencia - const function c++
Diferencia entre declaraciones const en C++ (6)
Cuál es la diferencia entre
void func(const Class *myClass)
y
void func(Class *const myClass)
Ver también:
y probablemente otros ...
El truco es leer estas cosas al revés:
void func(const Class *myClass)
Lee "myClass es un puntero a una clase que es const" lo que significa que no puedo hacer cambios en Class
void func(Class *const myClass)
Lee "myClass es un puntero constante para una clase" lo que significa que no puedo cambiar el puntero.
En C ++ esto
const MyClass *ptr
y esto
MyClass const *ptr
ambos significan que ptr
es un puntero variable que apunta a un objeto constante de tipo MyClass
. Es decir, no puede cambiar dicho objeto a través de ptr
. Sin embargo, puede hacer que ptr
apunte a algún otro objeto de MyClass
.
Por el contrario, esto
MyClass *const ptr
implica que ptr
es un puntero constante que apunta a un objeto MyClass
variable . Aquí puedes cambiar el objeto al que apunta ptr, pero no puedes hacer que ptr
apunte a otro objeto.
Tenga en cuenta que, entre los tres tipos de sintaxis anteriores, el segundo es un poco impar, 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.
La diferencia es que para
void func(const Class *myClass)
Usted señala una clase que no puede cambiar porque es const. Pero puedes modificar el puntero de myClass (déjalo apuntar a otra clase, esto no tiene ningún efecto secundario para la persona que llama porque su puntero es copiado, solo cambia tu local la copia del puntero) En contraste
void func(Class *const myClass)
Ahora myClass apunta a una clase que puede modificarse mientras no puedas cambiar el parámetro.
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 estrictamente hablando "un puntero a una clase que es const")
void func(Class *const myClass)
es un puntero constante para una clase
void func(const Class *myClass) { //...
Como se menciona en otras respuestas, esta definición significa que el parámetro myClass
apunta a una instancia de Class
que no puede ser modificada ( mutable
y const_cast
exceptuado) 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 otro lado, esta definición significa que el parámetro myClass
es un puntero a una instancia de Class
que no es const y por lo tanto puede ser utilizada por la función para manipular completamente la instancia de clase, pero que la variable puntero myClass
no puede ser alterada 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 la 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 dos declaraciones de funciones son equivalentes.
void func(Class *const myClass);
void func(Class *myClass);
En el primero, declaras una función que acepta un puntero a un objeto de Clase constante. No puedes modificar el objeto dentro de la función. En el segundo, declaras 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 a la cosa que está a la izquierda inmediata, si esto no existe, se aplica a la cosa que está a la derecha inmediata.
También eche un vistazo a esta pregunta que hice hace una semana, apunta a algunos enlaces muy útiles para comprender la exactitud de const.