从函数返回本地对象

时间:2010-04-02 16:50:56

标签: c++ memory function object reference

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

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));

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

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

5 个答案:

答案 0 :(得分:23)

getCar按值返回Car,这是正确的。

您无法将返回值(临时对象)传递到displayCar,因为displayCar需要Car&。您不能将临时绑定到非const引用。您应该更改displayCar以获取const引用:

void displayCar(const Car& car) { }

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

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

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

不要返回对本地Car变量的引用。

答案 1 :(得分:8)

你的问题是:

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

你应该使用const引用:

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

此功能:

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

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

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

通常,对于像string或Car这样的类类型,参数的默认选择应该始终是const引用。

答案 2 :(得分:4)

从函数返回局部变量的引用是不安全的。

所以这是正确的:

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

答案 3 :(得分:2)

是的,返回引用或指向临时对象的指针绝对不安全。当它到期时(即函数getCar退出时),你将离开技术称为“悬空指针”。

但是,如果您热衷于减少对象的复制操作,则应该查看C ++ 0x的“移动语义”。这是一个相对较新的概念,但我相信它很快就会成为主流。 GCC 4.4向上支持C ++ 0x(使用编译器选项-std=c++0x启用)。

答案 4 :(得分:0)

更好:

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