entre diferencia after c++ syntax pointers const parameters

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.