返回参考参数

时间:2012-07-06 21:45:25

标签: c++ reference

说我有以下代码:

#include <string>

using namespace std;

string GetPath(const string & aString);

int main()
{
    string dave = "hello";
    string tom = GetPath(dave);

}

string GetPath(const string & aString)
{
    //Do stuff

    //If function fails then return original string
    return aString;

    //or should it be like this
    return string(aString)

}

我有一种情况需要将字符串传递给函数,如果该函数失败了,那么我想简单地返回传入的字符串。

我的问题是,我稍微不确定刚刚返回aString的行为,因为它已通过引用传递。是否应该避免这种代码,如果是这样,为什么呢?我很惊讶我可以归还它(它可能会复制吗?)。

为了安全起见,我构建了一个要返回的新对象return string(aString),但这又可能是过度杀伤而且没有必要。

非常感谢任何澄清。

由于

3 个答案:

答案 0 :(得分:2)

是的,可以返回aString,因为按值返回,因此理论上会创建一个副本(RVO可以启动,但如果确实如此,则不会影响行为)。

  

为了安全起见,我构造了一个要返回的新对象返回字符串(aString),但这又可能是矫枉过正而且没有必要。

完全正确。只需return aString;即可。

答案 1 :(得分:1)

return aString;
     

我的问题是,我稍微不确定刚刚返回aString的行为,因为它已经通过引用传递了。是否应该避免使用这种代码,如果是这样,为什么呢?

不,那没关系。

  

我很惊讶我可以归还它(它可能会复制吗?)。

是的,它确实复制了。 (在这种情况下它必须复制)

  

为了安全起见,我构造了一个要返回的新对象返回字符串(aString),但这又可能是过度杀伤而且没有必要

是的,这将是一种矫枉过正。编译器可能会或可能不会将其优化为完全相同(通过RVO)。

答案 2 :(得分:1)

在我看来,您的主要关注点是您将aString传递给函数作为引用,然后在return aString中返回相同的引用。 你没有这样做,你的函数按值返回,所以如果有必要会创建一个副本,然后返回。

我猜你认为引用是指针的等价物,但它们并非如此。将它们更多地视为原始对象的“别名”,因此如果按值返回,则会返回副本。如果您返回const string &然后是,则返回对原始(希望未更改)对象的引用。