用值返回对象
出于效率的考虑,函数通常都是通过引用,或者说通过地址(也就是指针)方式来传递或返回大对象。很少有通过传值的方式来实现对象传递或返回的情况。但也有例外,一个典型的例子就是重载的 + 操作符。它必须返回一个结果对象,对其操作数不做修改。从表面上看,在堆中(使用new)分配结果对象的空间并返回其地址是很自然的选择。但是这样做并非上策,原因很简单:动态内存分配比局部存储区要慢很多。此外,它还可能失败并抛出异常,这个异常是我们必须要负责捕获并处理的;更槽的是还可能导致内存泄漏,因为删除该对象的责任不明确;有谁来删除对象呢?是对象的创建者,还是用户?另一个解决方案是用静态对象并通过引用返回结果。但这也是有问题的,因为每次使用重载的操作符时,都要修改并返回给调用者相同的静态对象实例,因而导致结果混淆。最安全、出错几率最小、效率最高的解决办法是通过传值来返回结果对象,例如:
class Date {
int d,m,y;
public:
Date operator + (const Date& other) const
{
Date temp = *this;
temp += other;
return temp;
}
};
搜索更多相关主题的帖子:
对象 内存 操作符 上策 Date