您的位置:首页 > 理论基础 > 计算机网络

http://www.zhihu.com/question/22821783/answer/22759545

2015-08-29 20:06 567 查看
http://www.zhihu.com/question/22821783/answer/22759545


c++中有些重载运算符为什么要返回引用?

1. c++中有些重载运算符为什么要返回引用,单单为了避免析构再构造吗?

2. 在此情况下,返回值为NULL或类似情况怎么办?

3. 返回的引用赋给一个变量后,那个变量是不是引用?怎么理解?

4. 据说返回局部对象的引用非常危险,请问返回引用到底有什么作用?,难道输入输出流返回的不是局部对象的引用?



举报

添加评论

分享

邀请回答

查看全部 3 个回答




钟宇腾,热爱C++与Python

许一舟庄威立某男 等人赞同

谢邀,我尝试一个个地解答。

1. c++中有些重载运算符为什么要返回引用,单单为了避免析构再构造吗?

不是。「有些」重载运算符要返回的引用,是为了返回它本身。如

class TestClass {
private:
int number;
public:
TestClass& operator+=(const TestClass& rhs) {
number += rhs.number;
return *this;
}
};


上例是一个C++的不完整的简单类,其中+=运算符,它本身的意义是「自增,并返回自增后的值」,所以就要返回自己,而不是返回一个自己的拷贝。

2. 在此情况下,返回值为NULL或类似情况怎么办?

引用不可为空,楼主所说的情况不存在。

3. 返回的引用赋给一个变量后,那个变量是不是引用?怎么理解?

#include <iostream>
using namespace std;

class StupidClass {
int flag;
public:
StupidClass(int flag): flag(flag) {
cout << "Constructor " << flag << endl;
}
~StupidClass() {
cout << "Destructor " << flag << endl;
}
StupidClass(const StupidClass& rhs) {
cout << "Copy Constructor *this=" << flag << " rhs=" << rhs.flag << endl;
}
StupidClass& operator=(const StupidClass& rhs) {
cout << "Operator = *this=" << flag << " rhs=" << rhs.flag << endl;
return *this;
}
StupidClass& operator+=(const StupidClass& rhs) {
cout << "Operator += *this=" << flag << " rhs=" << rhs.flag << endl;
flag += rhs.flag;
return *this;
}
};

int main() {
StupidClass var1(1), var2(2);
StupidClass var3 = var1 += var2;

return 0;
}


输出是

Constructor 1
Constructor 2
Operator += *this=1 rhs=2
Copy Constructor *this=3 rhs=3
Destructor 3
Destructor 2
Destructor 3


所以结果就是先执行var1 += var2,然后使用得来的var1对var3拷贝构造。其中var1中的flag变成3了(看后面两个Destructor 3,和Copy Constructor *this=3 rhs=3)。

如果把var3的类型改成StupidClass&,那么输出就变成

Constructor 1
Constructor 2
Operator += *this=1 rhs=2
Destructor 2
Destructor 1


那么var3就是var1的引用了。

4. 据说返回局部对象的引用非常危险,请问返回引用到底有什么作用?,难道输入输出流返回的不是局部对象的引用?

输入输出流重载的是 << 和 >> 运算符,一般是这样写的

ostream& operator<<(ostream& os, const TestClass& rhs) {
os << rhs.number;
return os;
}


这里面没有返回局部对象的引用啊,所谓返回局部对象的引用是像这样的

int& func() {
int dummy = 1;
return dummy;
}


在这里dummy就是一个「局部对象」。

编辑于 2014-02-22 6
条评论 感谢

分享

收藏没有帮助

举报

作者保留权利

更多回答

2


刘项http://github.com/lexdene

我只回答问题1,因为问题234,楼上的几位大牛已经说的很完整了。问题1:C++中有些重载运算符为什么要返回引用?答:因为C++标准中支持很多这种写法:int a; (a+=3)*=4;这不单发生在+=运算符上,还有=运算符。当然,大家最熟悉的应该是<<运算符:cout << "hel… 显示全部

2


匿名用户

题主还是没理清思路啊。要从两个角度分析这个问题:为什么返回应用?以及返回之后发生了什么?1、2 两问实际上是第一个问题:为什么在重载操作符的时候会返回引用?实际上这里的原因很简单:为了表达正确的语义。C++ 的操作符重载的全部意义就是为了让所谓… 显示全部
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: