0Pricing
C++ Academy · Lección

Paso por valor frente a paso por referencia

Compare las diferencias semánticas y de rendimiento entre pasar por valor y por referencia.

Paso por valor frente a paso por referencia es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

Repaso del paso por valor

Cuando pasa un argumento por valor, la función recibe una copia. Los cambios realizados dentro de la función no afectan al código que la llama.

void increment(int x) {
    x++;          // modifies the copy
}

int n = 5;
increment(n);
std::cout << n;   // still 5

Paso por referencia

Pase por referencia usando & en la lista de parámetros. La función trabaja directamente con la variable del código que la llama.

void increment(int& x) {
    x++;
}

int n = 5;
increment(n);
std::cout << n;   // now 6

¿Por qué pasar por referencia?

Hay dos motivos:

  • Evitar copiar objetos grandes (rendimiento)
  • Modificar la variable del código que llama (semántica)

Referencia const: lo mejor de ambos enfoques

Una referencia const evita las copias sin dar a la función permiso para modificar el objeto. Úsela para parámetros de entrada no triviales.

void printName(const std::string& name) {
    std::cout << name;
}

Reglas prácticas

Para los parámetros de funciones:

  • Baratos de copiar (int, double, puntero) → pasar por valor
  • Costosos de copiar y de solo lectura → const T&
  • La función modifica los datos del código que llama → T&

Paso por puntero

Los punteros también permiten modificar la variable del código que llama, pero este debe obtener la dirección explícitamente con &, lo que hace visible la intención.

void increment(int* x) {
    (*x)++;
}

int n = 5;
increment(&n);

Parámetros por referencia frente a parámetros por puntero

Las referencias son más convenientes cuando el valor siempre es necesario. Los punteros son apropiados cuando el argumento es opcional: pase nullptr para omitirlo.

Retorno por valor

El retorno por valor es la opción predeterminada. Gracias a RVO (Return Value Optimization) y a la semántica de movimiento, normalmente es igual de rápido que retornar por referencia y resulta más seguro.

Retorno por referencia

Devuelva una referencia cuando la función retorne un objeto existente que sobreviva a la llamada, como un miembro de un contenedor. Nunca devuelva una referencia a una variable local.

Mezclar estilos de paso en plantillas

Las plantillas suelen usar referencias universales (T&&) y std::forward para conservar las categorías de valor. Esto se explicará en el curso de semántica de movimiento.

Error común: slicing

Pase las clases derivadas por referencia (o por puntero) a un parámetro de la clase base. Pasar por valor recorta la parte derivada del objeto.

class Base { /* virtual */ };
class Derived : public Base { /* members */ };

void takeByValue(Base b);    // SLICES Derived!
void takeByRef(Base& b);     // OK

Comprobación rápida

¿Cómo debe pasar un std::string grande que la función solo lee?

Resumen

El paso por valor copia; el paso por referencia comparte. Use const T& para objetos grandes de solo lectura, T& cuando modifique los datos del código que llama y pase los tipos integrados pequeños por valor.

Preguntas frecuentes

¿La lección «Paso por valor frente a paso por referencia» es gratis?

Sí — el texto completo de «Paso por valor frente a paso por referencia» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Paso por valor frente a paso por referencia»?

Compare las diferencias semánticas y de rendimiento entre pasar por valor y por referencia. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Paso por valor frente a paso por referencia»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Por qué las referencias son alias de variables
  2. Paso por valor frente a paso por referencia
  3. Referencias const y cuándo utilizarlas
  4. Duración de las referencias y referencias colgantes
← Volver a C++ Academy