ProgramaciónDesarrollador C++

¿Qué es la sobrecarga de funciones (function overloading) y la resolución de sobrecarga (overload resolution) en C++? ¿Cuáles son las características al mezclar sobrecarga, argumentos por defecto y referencias?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

Historia del tema

C++ fue diseñado desde el principio como un lenguaje que soporta la sobrecarga de funciones: la posibilidad de declarar múltiples funciones con el mismo nombre pero con diferentes parámetros. Esto permite crear una API legible y conveniente.

Problema

Cuando hay muchas funciones con el mismo nombre, el compilador necesita elegir la implementación adecuada entre todas las sobrecargadas, considerando los tipos de argumentos, conversiones, parámetros por defecto y referencias. Con una sobrecarga descuidada, surgen ambigüedades y errores difíciles de detectar.

Solución

El compilador elige la función en función de la mejor coincidencia de la secuencia de argumentos, la precisión del tipo de coincidencia y las mínimas conversiones. Pero hay que tener en cuenta matices: si hay conversiones significativas o argumentos por defecto, se puede obtener inesperadamente ambigüedad.

Ejemplo de código:

void foo(int x); void foo(double x); void foo(int x, int y = 0); foo(5); // llamará a void foo(int x), porque es una coincidencia exacta foo(5.2); // llamará a void foo(double x) foo(5, 6); // llamará a void foo(int x, int y)

Características clave:

  • Todas las funciones deben diferir en un conjunto único de tipos/número de parámetros
  • Los argumentos por defecto para funciones sobrecargadas pueden complicar la resolución de sobrecarga
  • Referencias y conversiones de tipos pueden causar ambigüedad

Preguntas trampa.

¿Se puede sobrecargar funciones solo por el tipo de retorno?

No. La sobrecarga es posible SOLAMENTE por el tipo y número de parámetros, el tipo de retorno no participa en la resolución de sobrecarga.

int foo(); double foo(); // Error: la sobrecarga solo por el tipo de retorno no es posible!

¿Cómo elige el compilador qué función sobrecargada llamar si todos los parámetros son convertibles?

El compilador elige la "mejor coincidencia" — la función que requiere el menor número de conversiones de tipos, o una coincidencia exacta. Si existe ambigüedad, el código no se compilará.

void bar(int); void bar(long); bar(1); // int coincidencia exacta: se llamará a bar(int)

¿Se puede mezclar sobrecarga con argumentos por defecto y sobrecarga normal?

Se puede, pero se puede obtener ambigüedad en la llamada si las firmas de las funciones se superponen.

void test(int x); void test(int x, int y = 10); test(5); // Error: ambigüedad — ambas son adecuadas

Errores típicos y anti-patrones

  • Intersección de funciones sobrecargadas con parámetros por defecto
  • Conversión de tipos no evidente (por ejemplo, double → int)
  • Intento de sobrecarga solo por tipo de retorno

Ejemplo de la vida real

Caso negativo

En la biblioteca, hay funciones sobrecargadas con parámetros por defecto superpuestos, lo que lleva a errores de compilación al actualizar el código.

Pros:

  • Al principio, es fácil llamar a las funciones

Contras:

  • Errores al añadir nuevas sobrecargas con argumentos similares
  • Comportamiento impredecible de la selección automática de sobrecargas

Caso positivo

En el proyecto se establece un acuerdo: no mezclar sobrecargas con argumentos por defecto, o usar solo una función con valores por defecto o simplemente sobrecargar con parámetros únicos.

Pros:

  • Comportamiento explícito y predecible
  • Menos errores en el mantenimiento

Contras:

  • Firmas de API de funciones un poco más largas y verbosas