structures pointer pass objects declaring data c++ memory function object reference

pointer - pass by reference c++



Devolver un objeto local desde una funciĆ³n (5)

Aun mejor:

Car getCar(string model, int year) { return Car(model, year); }

¿Es esta la manera correcta de devolver un objeto desde una función?

Car getCar(string model, int year) { Car c(model, year); return c; } void displayCar(Car &car) { cout << car.getModel() << ", " << car.getYear() << endl; } displayCar(getCar("Honda", 1999));

Me aparece un error, "tomando la dirección de temporal". Debería usar de esta manera:

Car &getCar(string model, int year) { Car c(model, year); return c; }


No es seguro devolver la referencia de una variable local desde una función.

Entonces sí, esto es correcto:

Car getCar(string model, int year) { Car c(model, year); return c; }


Sí, definitivamente no es seguro devolver una referencia o un puntero a un objeto temporal. Cuando caduque (es decir, cuando la función getCar salga), te quedarás con lo que se conoce como "puntero colgante".

Sin embargo, si está interesado en reducir las operaciones de copia en un objeto, debería verificar C ++ 0x "Mover semántica". Es un concepto relativamente nuevo, pero estoy seguro de que se convertirá en main-stream lo suficientemente pronto. GCC 4.4 en adelante admite C ++ 0x (use la opción del compilador -std=c++0x para habilitar).


Tu problema es:

void displayCar(Car &car) { cout << car.getModel() << ", " << car.getYear() << endl; }

deberías usar una referencia constante:

void displayCar( const Car & car ) { cout << car.getModel() << ", " << car.getYear() << endl; }

Esta función:

Car getCar(string model, int year) { Car c(model, year); return c; }

está bien tal como está, pero todo lo que hace es lo que hace el constructor, por lo que es redundante. Pasar un valor atrás, en lugar de una referencia, es lo correcto para este tipo de función, sin embargo, el parámetro del modelo debe pasarse por referencia const:

Car getCar( const string & model, int year) {

En general, para tipos de clase como cadena o automóvil, su elección predeterminada para un parámetro siempre debe ser una referencia constante.


getCar devuelve un Car por valor, que es correcto.

No puede pasar ese valor de retorno, que es un objeto temporal, a displayCar , porque displayCar toma un Car& . No puede vincular una referencia temporal a una referencia no constante. Debe cambiar displayCar para tomar una referencia constante:

void displayCar(const Car& car) { }

O bien, puede almacenar el temporal en una variable local:

Car c = getCar("Honda", 1999); displayCar(c);

Pero, es mejor tener displayCar tomar una referencia constante ya que no modifica el objeto.

No devuelva una referencia a la variable de Car local.