为什么我们不能通过C ++中的函数通过引用返回对象?

时间:2018-12-04 11:07:28

标签: c++ pass-by-reference assignment-operator pass-by-value

据我了解,原因是我们不必要地为诸如a=b;(都是对象)之类的简单语句调用复制构造函数。

我没有得到的是,在我的书中写道,我们绝不应该通过引用传递对象,因为一旦函数终止,该引用就不复存在了。

那么我写在书中的文字是错误的还是我在这里遗漏了什么? Text 参考:Overloading assignment operator in C++

2 个答案:

答案 0 :(得分:4)

从函数返回引用没有错。

实际上就是通常定义赋值运算符 operator=的方法(使用return *this;进行方法链接)!

您不应该做的事是返回对超出范围的对象的引用,例如

int& undefinedBehaviourServer()
{
    int ub;
    return ub;
}

在这种情况下,ub具有自动存储期限,返回的引用将悬挂

答案 1 :(得分:-1)

函数完成后,其中声明的所有对象都会被销毁。因此,通过从函数返回链接,您可能会有调用远程对象的风险。让我们看一个典型的例子:

// don't do that!!!
std::string& get_str()
{
    std::string s = "abc";
    return s;
}


int main()
{
    string &s = get_str();
    // "abc"-string already destoyed at this moment
    std::cout << s; // attempt to deleted string: undefined behavior
}

因此,从函数返回对本地对象的引用是很危险的,因为这可能涉及访问已删除的对象(未定义的行为)。尽管从技术上讲返回对象(非本地)引用是可能的,并且经常使用。例如:

std::string& get_s()
{
    static std::string s = "abc";
    return s;
}
int main()
{
    std::string &s = get_s();
    std::cout << s; // that's OK
}