http://www.zhihu.com/question/22821783/answer/22759545
来源:互联网 发布:ipv6商业应用网络 编辑:程序博客网 时间:2024/04/28 14:42
http://www.zhihu.com/question/22821783/answer/22759545
c++中有些重载运算符为什么要返回引用?
1. c++中有些重载运算符为什么要返回引用,单单为了避免析构再构造吗?
2. 在此情况下,返回值为NULL或类似情况怎么办?
3. 返回的引用赋给一个变量后,那个变量是不是引用?怎么理解?
4. 据说返回局部对象的引用非常危险,请问返回引用到底有什么作用?,难道输入输出流返回的不是局部对象的引用?
2. 在此情况下,返回值为NULL或类似情况怎么办?
3. 返回的引用赋给一个变量后,那个变量是不是引用?怎么理解?
4. 据说返回局部对象的引用非常危险,请问返回引用到底有什么作用?,难道输入输出流返回的不是局部对象的引用?
查看全部 3 个回答
许一舟、庄威立、某男 等人赞同
谢邀,我尝试一个个地解答。
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就是一个「局部对象」。
1. c++中有些重载运算符为什么要返回引用,单单为了避免析构再构造吗?
不是。「有些」重载运算符要返回的引用,是为了返回它本身。如
class TestClass { private: int number; public: TestClass& operator+=(const TestClass& rhs) { number += rhs.number; return *this; }};
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 1Constructor 2Operator += *this=1 rhs=2Copy Constructor *this=3 rhs=3Destructor 3Destructor 2Destructor 3
如果把var3的类型改成StupidClass&,那么输出就变成
Constructor 1Constructor 2Operator += *this=1 rhs=2Destructor 2Destructor 1
4. 据说返回局部对象的引用非常危险,请问返回引用到底有什么作用?,难道输入输出流返回的不是局部对象的引用?
输入输出流重载的是 << 和 >> 运算符,一般是这样写的
ostream& operator<<(ostream& os, const TestClass& rhs) { os << rhs.number; return os;}
int& func() { int dummy = 1; return dummy;}
更多回答
2
我只回答问题1,因为问题234,楼上的几位大牛已经说的很完整了。问题1:C++中有些重载运算符为什么要返回引用?答:因为C++标准中支持很多这种写法:int a; (a+=3)*=4;这不单发生在+=运算符上,还有=运算符。当然,大家最熟悉的应该是<<运算符:cout << "hel… 显示全部
2
题主还是没理清思路啊。要从两个角度分析这个问题:为什么返回应用?以及返回之后发生了什么?1、2 两问实际上是第一个问题:为什么在重载操作符的时候会返回引用?实际上这里的原因很简单:为了表达正确的语义。C++ 的操作符重载的全部意义就是为了让所谓… 显示全部
0 0
- http://www.zhihu.com/question/22821783/answer/22759545
- http://www.zhihu.com/question/19935889
- http://www.zhihu.com/question/19630646
- http://www.zhihu.com/question/20790576
- java重拍 https://www.zhihu.com/question/34387716/answer/76029594
- https://www.zhihu.com/question/25427490/answer/30834017
- https://www.zhihu.com/question/26417244
- https://www.zhihu.com/question/22764869
- https://www.zhihu.com/question/20377285
- https://www.zhihu.com/question/19809484
- malloc 能申请多大的空间 http://www.zhihu.com/question/20836462
- 为什么指向的是最后一个节点的下一个节点 http://www.zhihu.com/question/20638791
- c++父类指针指向子类的具体原理? http://www.zhihu.com/question/31345300
- Android 手机自动化测试工具有哪几种? http://www.zhihu.com/question/19716849
- 如何使用 ggplot2?https://www.zhihu.com/question/24779017
- 【论文待读】Gcforest https://www.zhihu.com/question/56474891
- 关于比特币 https://www.zhihu.com/question/22076666
- C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765
- HDOJ1421 搬寝室(dp)
- ArrayList 和 练习
- 坚定自我的立场,捍卫自由
- 中断分层技术
- Android 入门(2)
- http://www.zhihu.com/question/22821783/answer/22759545
- List<File>
- 欢迎使用CSDN-markdown编辑器
- 排序总结
- UVa 12097 - Pie(二分查找)
- LeetCode:Summary Ranges
- DllImport调用系统DLL的方法
- Linux系统字符集配置
- php memcache单例