据我了解,原因是我们不必要地为诸如a=b;
(都是对象)之类的简单语句调用复制构造函数。
我没有得到的是,在我的书中写道,我们绝不应该通过引用传递对象,因为一旦函数终止,该引用就不复存在了。
那么我写在书中的文字是错误的还是我在这里遗漏了什么? Text 参考:Overloading assignment operator in C++
答案 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
}