2012-01-09 24 views
26

Código va primero:¿Puede la función de miembro de miembro devolver un puntero no const a un miembro de datos?

class A 
{ 
    public: 
     ... 
     int *foo() const 
     { 
      return _px; 
     } 
    private: 
     int *_px; 
} 

La función miembro foo devuelve un puntero no constante a private miembro de _px, que, creo, se abre una puerta a la modificación miembro de _px, ¿verdad?

¿Es foo una función de miembro const? ¿Debo agregar un const en frente del tipo de devolución?

ACTUALIZACIÓN

Qué const-miembro-función debe garantizar es que, no se puede cambiar cualquier dato miembros, ¿verdad?

En mi caso, la función foo no se abre una puerta a la modificación de los datos class A s miembros _px, pero una puerta a la modificación de lo que apunta a _px, así que mi pregunta es, ¿esto violan lo que es un const-función debe garantizar ?

+1

¿Qué dice el compilador con la advertencia habilitada? – Arunmu

+2

@ArunMu gcc 4.6.1 no dice nada. – jrok

+0

@ArunMu, bueno, parece que nada. – Alcott

Respuesta

27

Una función de miembro const solo puede devolver un puntero const o una referencia a un miembro.

Sin embargo, su ejemplo no devuelve un puntero a un miembro; está devolviendo una copia de un miembro que resulta ser un puntero. Eso está permitido en una función de miembro const (incluso si el puntero apunta a otro miembro).

Esto no se permitiría (tenga en cuenta que ahora es devolver una referencia):

int *& foo() const {return _px;} 

pero esto (volviendo una referencia const):

int * const & foo() const {return _px;} 
+0

Señor, su explicación es bastante clara y correcta. IMO, 'foo' en' clase A' abre una puerta para modificar a qué apunta '_px', lo cual, creo, hace que' foo' sea una función no miembro, ¿verdad? – Alcott

+0

@Alcott: 'const' en una función miembro solo protege a los miembros del objeto en sí, no a ningún otro nivel de indirección. Entonces, dentro de la función '_px' es efectivamente' int * const'; el puntero en sí no puede ser modificado, pero su objetivo puede ser. –

4

int *_px convierte int *const _px dentro de un método constante función esto implica que el puntero no se puede volver a insertar, pero los datos apuntados todavía se pueden modificar. Además, su función devuelve una copia del puntero para que no importe de todos modos.

1

Sí, para su caso sí puede. Sin embargo, generalmente se aconseja no hacer esto, ya que permite el cambio de objetos constantes:

void f(const A& a) 
{ 
    *(a.foo()) = 42; // damn! 
} 
3

no se abre una puerta a la modificación _px sino más bien lo _px puntos a. Depende de usted decidir si desea permitir esto o no. Por ejemplo, un iterator::operator-> devolvería un puntero no const y const_iterator::operator-> devolvería un puntero const. Ambos métodos pueden ser const ellos mismos.

+0

Sí, abre una puerta para modificar a qué apunta '_px'. – Alcott

Cuestiones relacionadas