本节书摘来自异步社区出版社《C++编程惯用法——高级程序员常用方法和技巧》一书中的第2章,第2.8节,作者: 【美】Robert B. Murray ,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.8 返回值为引用
函数可以返回一个引用。返回引用和返回指针差不多;被引用的对象在函数返回时必须仍然存在。尤其是,我们不能返回一个自动变量(automatic variable)的引用,其原因和我们不能返回一个指向自动变量的指针一样:当函数返回时,所有的自动变量都将会被摧毁,这时我们所能得到的只是一个空悬(dangling)引用。
例如,由于被赋值的对象在赋值结束后仍然存在,我们的String类中的赋值操作符就可以返回一个指向*this的引用。然而,用来创建一个新的String对象的连接操作的函数则必须返回一个值:
String /*不是String&*/
operator+ (const String& left, const string& right){
String result;
//在此处构建"result",
return result;
}
由于在operator+返回时,result会被摧毁,所以我们不能返回一个指向result的引用。我们必须用值的方式返回它,这将产生result的一个拷贝,函数会把该拷贝返回给调用函数。
在此我们的程序会有一些性能上的损耗,因为我们必须先构建一份对象的局部拷贝,然后再通过调用复制构造函数把它给返回给调用函数;不过由于这种用法的普遍性,许多的编译器都可以把这份额外的拷贝给优化掉[5]。