从函数返回本地对象

poc*_*coa 10 c++ memory reference function object

这是从函数返回对象的正确方法吗?

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));
Run Code Online (Sandbox Code Playgroud)

我收到一个错误,"收取临时地址".我应该这样使用:

Car &getCar(string model, int year) {
   Car c(model, year);
   return c;
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 23

getCar返回一个Car值,这是正确的.

你不能将那个返回值(一个临时对象)传递给displayCar,因为displayCar需要一个Car&.您不能将临时绑定到非const引用.你应该displayCar改为采用const引用:

void displayCar(const Car& car) { }
Run Code Online (Sandbox Code Playgroud)

或者,您可以将临时存储在本地变量中:

Car c = getCar("Honda", 1999);
displayCar(c);
Run Code Online (Sandbox Code Playgroud)

但是,最好displayCar采用const引用,因为它不会修改对象.

不要返回对局部Car变量的引用.


小智 8

你的问题是:

void displayCar(Car &car) {
   cout << car.getModel() << ", " << car.getYear() << endl;
}
Run Code Online (Sandbox Code Playgroud)

你应该使用const引用:

void displayCar( const Car & car ) {
   cout << car.getModel() << ", " << car.getYear() << endl;
}
Run Code Online (Sandbox Code Playgroud)

这个功能:

Car getCar(string model, int year) {
   Car c(model, year);
   return c;
}
Run Code Online (Sandbox Code Playgroud)

就好了,但它所做的只是构造函数所做的,所以它是多余的.传递值而不是引用是对这种类型的函数做的正确的事情,但是,模型参数应该由const引用传递:

Car getCar( const string & model, int year) {
Run Code Online (Sandbox Code Playgroud)

通常,对于类类型(如字符串或Car),参数的默认选择应始终为const引用.