c++ - retorna - ¿Puede la función miembro const devolver un puntero no constante a un miembro de datos?
retornar un char en c (5)
El código va primero:
class A
{
public:
...
int *foo() const
{
return _px;
}
private:
int *_px;
}
La función miembro foo
devuelve un puntero no constante al miembro private
_px
, que, creo, abre una puerta para modificar el miembro _px
, ¿verdad?
¿Es foo
una función miembro const
? ¿Debo agregar una const
delante del tipo de retorno?
ACTUALIZAR
Lo que una función de miembro constante debería garantizar es que no puede cambiar ningún miembro de datos, ¿verdad?
En mi caso, la función foo
no abre una puerta para modificar _px
miembro de datos de la class A
, sino una puerta para modificar a qué apunta _px
. Así que mi pregunta es, ¿esto viola lo que debería garantizar una función constante?
No abre una puerta a la modificación de _px
sino a lo que apunta _px
. Depende de usted decidir si desea permitir esto o no.
Por ejemplo, un iterator::operator->
devolvería un puntero no constante y const_iterator::operator->
devolvería un puntero constante. Ambos métodos pueden ser constantes.
Sí, para su caso puede. Sin embargo, generalmente se recomienda no hacer esto, ya que permite cambiar objetos constantes:
void f(const A& a)
{
*(a.foo()) = 42; // damn!
}
Sí, por ejemplo, vea los punteros std :: streambuf:
protected:
char* pbase() const;
char* pptr() const;
char* epptr() const;
Una función miembro const
solo puede devolver un puntero const
o una referencia a un miembro.
Sin embargo, su ejemplo no está devolviendo 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 estaría permitido (tenga en cuenta que ahora está devolviendo una referencia):
int *& foo() const {return _px;}
pero esto haría (devolviendo una referencia const
):
int * const & foo() const {return _px;}
int *_px
convierte en int *const _px
dentro de una función de miembro const. Esto implica que el puntero no se puede reubicar, pero los datos apuntados aún son modificables. Además, su función devuelve una copia del puntero por lo que no importa de todos modos.