Pregunta

Me interesó un comentario en una de mis publicaciones:

  

Yo también . También le doy a los accesores / mutadores el mismo nombre.

Me preguntaba sobre esto, porque siempre he usado setBar (int bar) en lugar de un mutador llamado igual. Quiero saber: ¿puede el compilador determinar con base en un identificador constante qué muta en tiempo de ejecución, o puede usar el mismo nombre de función porque tiene un parámetro?

¿Esta compilación estará bien?

class Foo
{
   int bar_;

   public:
      int bar() { return bar_; }
      void bar(int bar) { bar_ = bar; }
}

O tengo que hacer esto (me doy cuenta de que debería estar haciendo esto de todos modos, solo corre conmigo en esto):

int bar() const { return bar_; }

No sé cuál es cuál. La corrección constante es importante, por lo que creo que me gustaría que el compilador se oponga a la sobrecarga, ya que uno muta y el otro no.

¿Por qué funciona de esta manera?

¿Fue útil?

Solución

Lo primero que mira el compilador es el número y tipo de parámetros que está pasando a la función. Esto resuelve la sobrecarga en bar incluso antes de que necesite mirar const -ness.

Si no puede marcar bar () como const , el compilador le informará de esto la primera vez que intente llamar a bar () en una instancia const del objeto.

Otros consejos

El compilador no le impedirá escribir una función miembro no constante que de hecho no mute el objeto. Eso no es una violación de la corrección constante, lo que solo garantiza que los objetos no se muten a través de referencias constantes. El principio aquí es que const dice que la función puede no mutar, y no const significa que la función es libre de mutar si así lo desea. No hay forma de prometer mutar, y que el compilador haga cumplir eso: creo que esto sería una garantía demasiado vaga para ser útil para las personas que llaman.

Como dice Greg, el compilador se opondrá cuando intentes llamar a una función miembro no const en un objeto const (de nuevo, es irrelevante si de hecho muta. Lo único importante es si se declara const).

Para una comprensión más fácil, considere que el compilador supone que se cambiará un objeto si se llamará a un método no constante para ese objeto.

Entonces, en un método const, si llama a un método no const para uno de los miembros de datos u otro método no const de la clase, el compilador señalará un error.

También puede considerar los operadores como métodos (lo sé, puede definir algunos operadores como funciones amigas, no como métodos, sino para simplificar ...). Por ejemplo, el operador de asignación (operador =) es por defecto no constante. Eso significa que si haces algo como

void MyClass::MyConstMethod() const
{
   classMember = value;
}

El compilador considerará que llamó al operador de asignación de classMember, que dentro de un método const es un objeto const. Dado que operator = no es constante, se informará un error del compilador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top