2008-10-30 26 views
51

En C++, la firma de una función depende en parte de si es const. Esto significa que una clase puede tener dos funciones miembro con firmas idénticas, excepto que una es const y la otra no. Si tiene una clase como esta, el compilador decidirá a qué función llamar en función del objeto que lo llame: si se trata de una instancia const de la clase, se llamará a la versión const de la función; si el objeto no es const, se llamará a la otra versión.¿Cuál es el uso de la sobrecarga const en C++?

¿En qué circunstancias podría desear aprovechar esta función?

Respuesta

24

Esto realmente solo tiene sentido cuando la función miembro devuelve un puntero o una referencia a un miembro de datos de su clase (o un miembro de un miembro, o un miembro de un miembro, ... etc.) . Por lo general, no se aceptan los indicadores que no confirman ni las referencias a los miembros de los datos, pero a veces es razonable o simplemente muy conveniente (por ejemplo, [] operador). En tales casos, proporciona una versión const y una no const del getter. De esta forma, la decisión de si el objeto puede modificarse o no depende de la función que lo utiliza, que tiene la opción de declararlo const o non-const.

23

Está ahí para que pueda hacer que el compilador aplique si devuelve un objeto const o uno normal, y aún mantiene la misma firma de método. Hay una explicación detallada en Const Correctness.

4

Es posible que desee utilizarlo para decidir si desea devolver o no una referencia constante a un objeto. Los contenedores de STL usan una función de inicio() y fin() sobrecargada const para decidir si se devuelve un const_iterator o un iterador normal.

4

Eche un vistazo al comportamiento de std :: map :: operator []. La versión de const arroja un error si intenta hacer referencia a una clave inválida, pero la versión no const hace un inserto. El comportamiento de inserción es mucho más útil que tener que usar std :: map :: insert (y además sobrescribirá), pero no puede funcionar para un mapa const.

Cuestiones relacionadas