es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuál es la diferencia?

Estoy aprendiendo C++ y estoy haciendo un pequeño juego en el que tuve que pasar un objeto como parámetro por referencia, y al principio hice algo así:

void function(OBJECT* obj) {
     std::cout << obj->x;
}

luego:

OBJECT obj(2);
function(&obj);  //2

El parámetro es un puntero y llamo a la función con el parámetro por referencia. Eso es lo que pensé.
Pero en Internet he visto que se llama a la función sin referencia, y en la definición:

function(OBJECT &obj) {
    std::cout << obj.x;
}

Entonces, ¿cuál es la diferencia entre esto:

class Road {
  public:
    int limit_r, limit_l;
    Road(int _limit_r, int _limit_l) : limit_r(_limit_r), limit_l(_limit_l) {}
};
class Car {
    int x;
  public:
    Car(int _x) : x(_x) { };
    void move(Road &r);
};
void Car::move(Road &r) {
    while (this->x >= r.limit_r) {
        this->x++;
    }
}
int main() {
    Road road(0, 20);
    Car car(road.limit_r);
    car.move(road);
    return 0;
}

Y esto:

...
class Car {
    ...
  public:
    ...
    void move(Road* r); //Cambiado
};
void Car::move(Road* r) { //Cambiado
    while (this->x >= r->limit_r) {  //Cambiado
        this->x++;
    }
}
int main() {
    Road road(0, 20);
    Car car(road.limit_r);
    car.move(&road);  //Cambiado
    return 0;
}

¿Hay alguna diferencia? ¿Cuál es mejor o más correcto?

¿Por qué cambia la forma de llamar a una propiedad o método? (road->limit_r y road.limit_r)

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La diferencia entre los dos fragmentos de código está en el mecanismo de paso de parámetros. En el primer fragmento de código, la función function toma un puntero a un objeto de tipo OBJECT como parámetro, y en el segundo fragmento de código, el método move de la clase Car toma una referencia a un objeto de tipo Road como parámetro.

    Ambos enfoques son válidos, pero usar una referencia como parámetro generalmente se considera una mejor práctica en C++. Esto se debe a que las referencias son menos propensas a errores que los punteros: las referencias no pueden ser nulas y no se pueden reasignar para apuntar a un objeto diferente una vez que se han inicializado. Pasar por referencia también resulta en un código más limpio y legible.

    En el primer fragmento de código, la propiedad x del objeto apuntado por obj se accede utilizando el operador de flecha (->) debido a que obj es un puntero. En el segundo fragmento de código, x se accede utilizando el operador de punto (.) porque obj es una referencia.

    En el segundo fragmento de código, el método move toma un puntero a un objeto Road como parámetro, y la propiedad x del objeto Road se accede utilizando el operador de flecha porque r es un puntero. Esta sintaxis se utiliza porque r es un puntero, y el operador de flecha se utiliza para acceder a propiedades o métodos de objetos a los que apuntan los punteros.

Comments are closed.