ProgramaciónDesarrollador backend de C++

¿Cómo funciona la herencia de los métodos de paso de parámetros en C++ (paso por valor, por puntero, por referencia) y cuáles son las trampas de cada método?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

En C++, los parámetros de función (incluidos los miembros de los métodos) se pueden pasar:

  • Por valor (by value): se crea una copia del objeto dentro de la función. El original no se modifica, pero si hay recursos dinámicos, ¡puede haber copias incorrectas!
  • Por puntero (by pointer): se pasa la dirección. Se puede modificar el original, hay posibilidad de nullptr, y el peligro se debe a la falta de verificación y gestión de memoria.
  • Por referencia (by reference): como por puntero, pero la sintaxis es la de una variable común. La referencia debe ser válida, no se puede redirigir, pero con const se reduce la sobrecarga de copiado.

Ejemplo:

void foo(int value); // por valor void foo(int* ptr); // por puntero void foo(const int& ref); // por referencia (¡óptimo para objetos grandes!)

Al pasar por referencia puede implementarse la optimización (copy elision), y para objetos grandes se recomienda const &. Para punteros, siempre verifica nullptr.

Pregunta capciosa.

¿Cuál es la diferencia entre const MyClass& obj y MyClass obj en los parámetros de una función?

Respuesta:

const MyClass& no copia el objeto, solo proporciona acceso sin posibilidad de modificarlo (óptimo para objetos grandes). MyClass obj siempre hace una copia, lo cual es costoso para tamaños grandes o cuando no se realiza una copia correcta (por ejemplo, deep copy no implementado).

void process(const std::string& s); // No copia void process(std::string s); // Copia

Ejemplos de errores reales por desconocer las sutilezas del tema.


Historia En la biblioteca corporativa de estructuras matemáticas, un programador decidió acelerar el trabajo, pasando grandes contenedores por valor. Esto causaba costos significativos en cada llamada a la función — la eficiencia se redujo a la mitad.


Historia En el módulo de gestión de usuarios se usaban punteros sin verificar nullptr. A veces ocurrían fallos aleatorios al acceder a punteros no válidos, la depuración tomó meses.


Historia En un proyecto de procesamiento de imágenes, algunas funciones tomaban objetos por valor y otras por referencia. Para una de las clases no se implementó deep copy, lo que causó fugas de memoria y un compartir de recursos no intencionado después de pasar por valor.