Regresar no-const de referencia de una función miembro const

¿Por qué devolver la referencia a una punta a la variable de miembro de trabajar, pero no en el otro? Yo sé que un const función de miembro sólo debe devolver const referencias, pero ¿por qué ese no parece cierto para los punteros?

class MyClass
{
  private:
    int * a;
    int b;
  public:
    MyClass() { a = new int; }
    ~MyClass() { delete a; }

    int & geta(void) const { return *a; } //good?
    int & getb(void) const { return b; }  //obviously bad
};

int main(void)
{
  MyClass m;

  m.geta() = 5;  //works????
  m.getb() = 7;  //doesn't compile

  return 0;
}

2 Kommentare

  1. 21
    int & geta(void) const { return *a; } //good?
    int & getb(void) const { return b; }  //obviously bad

    En una constante de la función de cada miembro de datos se convierte en const de tal manera que éste no puede ser modificado. int se convierte en const int, int * se convierte en int * const, y así sucesivamente.

    Desde el tipo de a en su primera función se convierte en int * const, en contraposición a const int *, así que usted puede cambiar los datos (que es modificable):

      m.geta() = 5;  //works, as the data is modifiable

    Diferencia entre : const int* y int * const.

    • const int* significa que el puntero es no const, pero los datos que señala el puntero es const.
    • int * const significa que el puntero es const, pero los datos que señala el puntero es no const.

    Su segunda función intenta devolver const int &, desde el tipo de b convertido en const int. Pero usted ha mencionado la rentabilidad real tipo en el código como int &, por lo que esta función sería no incluso compilar (ver este), independientemente de lo que haga en main(), debido a que el retorno tipo no coincide. Aquí está la solución:

     const int & getb(void) const { return b; }  

    Ahora compila bien!.

    • pero ahora el valor de retorno es como un r-value y usted no puede modificar o asignar! lo que si queremos volver a un no-const de referencia?
    • const función de miembro no se puede devolver el no-const de referencia para el miembro de datos. si desea devolver no-const de referencia para el miembro de datos, entonces usted ha no-const de la versión de la función de miembro.
    • entonces, ¿cómo puedo decirle al usuario que esta función no es la modificación de la instancia( fue el uso de la const función de miembro! )?
    • no const miembro de la función puede ser invocada SÓLO no const objetos, mientras que const miembro de la función puede ser invocada en const así como la no-const objeto, sino que se invoca en la no-const objeto sólo si no existe un no-const miembro de la función (la cual puede ser invocada en la no-const objeto). Entonces, ¿cuál es tu pregunta? Sea lo que sea, se puede encontrar una respuesta en mi comentario de alguna manera?
    • Estaba leyendo este:isocpp.org/wiki/faq/… y parece que le está aconsejando que int & geta(void) const { return *a; } // good? no debe ser escrito. Es mi conclusión correcta? Particularmente estoy hablando de los bits donde se dice que a veces el compilador de la captura, a veces no.
  2. 6

    Porque a se convierte en int * const a;. Es decir, usted no puede cambiar el valor de a (cambio de lo que los puntos a), así como const dice. La const-dad de lo que a puntos en es un asunto completamente diferente.

    Por favor vea mi respuesta aquí para una discusión más completa de la const y funciones miembro const.

    • ¿Por qué no pensé en eso. Es el puntero de la const, no lo que se apunta… Gracias

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea