这是从函数返回对象的正确方法吗?
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;
}
答案 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);
}