← SEARCHABLE ARCHIVE
C / C++ · 2026-06-03

C++ de los fundamentos al dominio — Lección 7

Diferencias entre constante, referencia y puntero

INTERACTIVE READING MODE →

Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.

Al pasar un objeto a una función, debes decidir si utilizar un valor, una referencia o un puntero. Aunque son similares en la superficie, existe una gran diferencia en la posibilidad de copiarlos y modificarlos.

Valores y Referencias

void PrintItem(Item item);              //Pasando por valor
void UpgradeItem(Item& item);           //pasando por referencia
void PrintItem(const Item& item);       //Pasando referencias constantes

Si lo pasa por valor, la función puede recibir una copia por separado. Si es un int pequeño, no hay problema, pero si es una cadena y un objeto con varios miembros, la copia puede ser innecesaria.

Item&es un alias del original. Si lo modificas dentro de la función, también se modifica el original. const Item&Evita la copia y previene la modificación del original. Esta forma se utiliza a menudo cuando se pasa un objeto que debe ser de sólo lectura.

class Monster
{
public:
    int GetHealth() const
    {
        return health;
    }

    const std::string& GetName() const
    {
        return name;
    }

private:
    int health = 100;
    std::string name = "Slime";
};

La constante después de la función significa que esta función miembro no cambia el estado del objeto. const MonsterAquí es donde existe una diferencia entre funciones que se pueden llamar y funciones que no se pueden llamar.

cadenaconst std::string&Puede evitar copiar la cadena devolviendo . Sin embargo, es importante recordar que resulta peligroso si el objeto original se destruye antes de la referencia devuelta.

puntero

Un puntero almacena la dirección de un objeto.

Monster monster;
Monster* target = &monster;

if (target != nullptr)
{
    std::cout << target->GetHealth() << '\n';
}

Un objeto normal es.y el objeto señalado por el puntero es->acercarse. Un puntero puede no señalar nadanullptrSe necesita inspección.

El punto importante aquí es que el hecho de que un puntero apunte a un objeto no significa necesariamente que sea propietario de ese objeto. Los punteros en bruto, en los que no se determina quién destruirá el objeto, se vuelven más peligrosos a medida que el código crece.

Monster* target = nullptr;

{
    Monster monster;
    target = &monster;
}

//El objetivo tiene la dirección de un monstruo que ya ha sido destruido.

Este tipo de puntero se llama puntero colgante. Incluso si la dirección misma permanece, el objeto en esa dirección ya ha llegado al final de su vida.

Las referencias son buenas para usar en situaciones en las que deben apuntar a un objeto válido. Los punteros son adecuados para situaciones en las que el objeto puede no estar presente o puede apuntar a otro objeto.

Y si el puntero debe poseer el objeto, es mejor considerar los punteros inteligentes antes que los punteros sin formato.