2012-06-11 13 views
20

En el siguiente programa cuerpo cosists de un vector de punteros. Puntos es una estructura de coordenadas x, y, z y un punto_id. Creo que a medida que el cuerpo pasa por referencia constante, el siguiente paso debería producir un error. BUt el programa se está ejecutando sin ningún problema. ¿Puedes explicarme por qué es esto?C++ pasando por const referencia

void readOutFile(const Body& body, int n){ 

    .... 

    body.bp[0]->points.push_back(Point_id(p,i)); 
} 
+2

'body' se pasa como' const' pero no hay forma de que el compilador sepa que 'body.bp [0] -> points' debe ser' const' también. – wroniasty

+0

Se ejecutará correctamente y el error const será un error de tiempo de compilación, no un error de tiempo de ejecución. –

+3

En C++, const es superficial, no profunda. Entonces afecta el objeto pero no sus asociaciones. Significa que solo puedes llamar a los métodos const. Pero los métodos const pueden cambiar otros objetos, siempre usan métodos en la interfaz, y usan una buena herramienta de pelusa para verificar la const profunda. –

Respuesta

6

Solo body es constante.

body.bp[0]->points es no se ven afectados por el constantness de body

38

aquí está el problema:

body.bp[0]->points.push_back(Point_id(p,i)); 
      ^^ 

Indirecting través de un puntero elimina cualquier constness; más bien, la constness del resultado depende del tipo de puntero.

T *t;    // pointer to T: can modify t and (*t) 
const T *t;  // pointer to const-T: can modify t but not (*t) 
T *const t;  // const-pointer to T: can modify (*t) but not t 
const T *const t; // const-pointer to const-T: can't modify either t or (*t) 
+3

Nunca me di cuenta de esto, pero tiene sentido. Constness se propaga al puntero del miembro pero no a su contenido también. –

6

Sí, body es constante. Eso significa que no se pueden invocar funciones miembro no constantes, y no se pueden modificar variables miembro.

Ni se está haciendo. El único miembro de body utilizado es body.bp[0], que no cambia tampoco, sino que simplemente utiliza para llegar a points, que podría o no ser constante ...

corolario: No hacer que los miembros de datos públicos.

16

Este es uno de los mejores ejemplos que muestra por qué data members should not be public.

aquí, body es constante, por lo tanto sus miembros de datos no deben ser cambiados, pero en body.bp[0]->points punto se está cambiando, que no es el miembro de Body .Hence ninguna violación const.

+5

Para mí, este es un ejemplo de por qué los ** punteros de miembro ** no deberían ser públicos. No hay nada malo con los miembros públicos de datos de "valor". – ulidtko

Cuestiones relacionadas