【Exceptional C++(4)】临时对象
2018-01-26 本文已影响5人
downdemo
问题
- 下面代码中至少有三处用到了不必要的临时对象,找出来
string FindAddr(list<Employee> l, string name)
{
for (list<Employee>::iterator i = l.begin(); i != l.end(); i++)
{
if ( *i == name)
{
return (*i).addr;
}
}
return "";
}
解答
- 前两处:第一行的函数参数,使用传值导致list和string的拷贝,应当使用const&
- 第三处:for循环中的i++,后增在递增前还要一个临时对象保存递增前的值
- 第四处:if判断中,虽然没有体现出Employee类,但是要进行比较操作,要么执行一个转换成string的操作,要么通过一个转换构造函数得到一个string,这两种方法都会产生临时对象导致对string或Employee的operator=调用
- 第五处:return语句,产生一个临时的空string对象,更好的做法是声明一个局部string保存返回值,再return这个string对象,这样编译器可以启动返回值优化处理来省略局部对象。但绝对不要返回临时对象的引用
string FindAddr(const list<Employee>& l,const string& name)
{
string addr;
for (list<Employee>::const_iterator i = l.begin(); i != l.end(); ++i)
{
if ( (*i).name == name)
{
addr = (*i).addr;
break;
}
}
return addr;
}