C++ 关于返回引用的问题

来源:百度知道 编辑:UC知道 时间:2024/06/17 05:06:33
Fraction Fraction::operator*(const Fraction &a) const
{
Fraction result;
result.nume=nume*a.nume
result.deno=deno*a.deno;
return result;
}
不考虑化简问题,只是想请教大家,如果此处我不想返回一个对象,为了提高效率,我想返回一个引用,可以吗?怎么实现呢?
非常感谢!
恩,赞同二楼,一楼大哥,你的答案有问题。这样做会造成内存泄露。
函数一旦调用完毕,对象销毁,估计会报错~~

噢,那么按照pur_e 大哥的方法,理论上讲,如果代码够复杂,效率是否会较高呢?

恩,今天刚查了Effective C++,没想到4楼的兄弟就说出来了。而且,里面还有一点就是针对我这个问题,根据上面英文说的,我理解是,不要为了返回引用而返回引用。我这种情况,还是返回对象比较合适。不过,真的谢谢各位了。pur_e 的答案虽然不好,但是很尽力的为我答疑,就把分送给你了。谢谢各位。

效率会高一些,但之后的临时变量删除是个问题,可以参考楼上,不过这样的话又会增加空间和时间的开销,最后孰优孰劣我也不清楚了

而且auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果。
___________________________________________
知道new是什么意思吗?

new是在堆中申请内存,函数执行完后会销毁栈中的对象,而不是堆中的,new的内存,除非用delete删除,否则一直存在

————————————————————————
代码如下,有问题hi 我

Fraction &Fraction::operator*(const Fraction &a) const
{
Fraction *result=new Fraction();
result->nume=nume*a.nume
result->deno=deno*a.deno;
return *result;
}

换个角度来考虑,所谓“引用”,你也得有一个对象才能引用吧?就拿 x * y 来说好了,x * y 的结果是一个中间值,你如果要让这个中间值是一个引用,但是 x * y 就只有 x y 这两个对象,你引用任何一个,都会使它的值发生改变,这可不是 x * y 的原意啊。
我认为可以参考 pur_e 的方法,但是可以吧 new Fraction 返回的对象指针 (即 x * y 的中间结果) 放入一个静态的 vector<auto_ptr<Faction>> 中,这样在这个 vector 销毁时,这些中间结果的对象也会随之销毁。

不可以,因为*操作符,返回的一般都是中间值,而不是对某个已知值的引用。按楼上的方法可以返回引用,但是会造成内存泄露。

如:x * y * z。

Effective C++ 明确指出 不支持这种做法 很危险 除非你返回的不是一个局部变量的引用