http://www.zhihu.com/question/22821783/answer/22759545
2015-08-29 20:06
567 查看
http://www.zhihu.com/question/22821783/answer/22759545
1. c++中有些重载运算符为什么要返回引用,单单为了避免析构再构造吗?
2. 在此情况下,返回值为NULL或类似情况怎么办?
3. 返回的引用赋给一个变量后,那个变量是不是引用?怎么理解?
4. 据说返回局部对象的引用非常危险,请问返回引用到底有什么作用?,难道输入输出流返回的不是局部对象的引用?
举报
添加评论
分享
• 邀请回答
许一舟、庄威立、某男 等人赞同
谢邀,我尝试一个个地解答。
1. c++中有些重载运算符为什么要返回引用,单单为了避免析构再构造吗?
不是。「有些」重载运算符要返回的引用,是为了返回它本身。如
上例是一个C++的不完整的简单类,其中+=运算符,它本身的意义是「自增,并返回自增后的值」,所以就要返回自己,而不是返回一个自己的拷贝。
2. 在此情况下,返回值为NULL或类似情况怎么办?
引用不可为空,楼主所说的情况不存在。
3. 返回的引用赋给一个变量后,那个变量是不是引用?怎么理解?
输出是
所以结果就是先执行var1 += var2,然后使用得来的var1对var3拷贝构造。其中var1中的flag变成3了(看后面两个Destructor 3,和Copy Constructor *this=3 rhs=3)。
如果把var3的类型改成StupidClass&,那么输出就变成
那么var3就是var1的引用了。
4. 据说返回局部对象的引用非常危险,请问返回引用到底有什么作用?,难道输入输出流返回的不是局部对象的引用?
输入输出流重载的是 << 和 >> 运算符,一般是这样写的
这里面没有返回局部对象的引用啊,所谓返回局部对象的引用是像这样的
在这里dummy就是一个「局部对象」。
编辑于 2014-02-22 6
条评论 感谢
分享
收藏 • 没有帮助 •
举报
• 作者保留权利
更多回答
2
我只回答问题1,因为问题234,楼上的几位大牛已经说的很完整了。问题1:C++中有些重载运算符为什么要返回引用?答:因为C++标准中支持很多这种写法:int a; (a+=3)*=4;这不单发生在+=运算符上,还有=运算符。当然,大家最熟悉的应该是<<运算符:cout << "hel… 显示全部
2
题主还是没理清思路啊。要从两个角度分析这个问题:为什么返回应用?以及返回之后发生了什么?1、2 两问实际上是第一个问题:为什么在重载操作符的时候会返回引用?实际上这里的原因很简单:为了表达正确的语义。C++ 的操作符重载的全部意义就是为了让所谓… 显示全部
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++ 的操作符重载的全部意义就是为了让所谓… 显示全部
相关文章推荐
- http编程(一)使用javaAPI实现
- 关于运算符重载(总结) --http://www.cnblogs.com/xyl-share-happy/archive/2012/12/06/2804401.html
- HttpURLConnection_Get和Post请求文件上传
- HTTP协议详解
- CentOS minimal 网络配置
- muduo网络库源码学习————线程池实现
- httpd
- muduo网络库源码学习————无界队列和有界队列
- 多客户端服务器网络编程
- RMI * Hessian * Burlap * Httpinvoker * WebService
- 网络号和主机号的计算(转载)
- bp神经网络算法中的权值修改问题
- hdu 4739 2013杭州赛区网络赛 寻找平行坐标轴的四边形 **
- http://www.gisinternals.com/aboutgisinternals.html
- .net学习笔记---HttpHandle与HttpModule
- 网络技术杂技
- SOCKET 编程TCP/IP、UDP
- SOCKET 编程TCP/IP、UDP
- SOCKET 编程TCP/IP、UDP
- SOCKET 编程TCP/IP、UDP