2009-01-28 11 views

Respuesta

21

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.

11

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.

+1

+1 para una buena respuesta y la sugerencia sobre cómo recordar la const-ness, esa es la que uso también. – xan

1

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.

5

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

+0

para definiciones muy sueltas de derecha-> izquierda.Estrictamente, el primero parece más como 'puntero a una clase const' para mí –

+0

Esta regla se rompe al ver esto: MyClass const * ptr –

+0

drhorrible: "una clase que es const", entonces, si quieres ser pedante. ;) Frederick: ¿Por qué? Un puntero a un const MyClass? Parece sencillo. – jalf

2

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.

2
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); 
Cuestiones relacionadas