En C++, los parámetros de función (incluidos los miembros de los métodos) se pueden pasar:
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.
¿Cuál es la diferencia entre
const MyClass& objyMyClass objen 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
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.