retornar retorna que punteros puntero lenguaje estructura ejemplos datos como aritmetica c++ const

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! }



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.