一个重载自加后置运算符的困惑

0x554 2015-08-23 11:47:13
大神们,我今天在实现重载自加后置运算符的时候遇到一个困惑:
代码是这样的,为了方便就先写在一起了:

#include <iostream>

using namespace std;
class Test{
unsigned int number;
public:
Test(){
cout<<"无参构造函数"<<endl;
}
Test(unsigned int n):number(n){
cout<<"test01(100) => "<<number<<" 带参构造函数"<<endl;
}
~Test(){
cout<<"~Test() => "<<"析构地址 : "<<this<<" "<<"析构对象 : "<<number<<endl;
}
unsigned int getnumber()const{
return number;
}

Test &operator=(const Test&t){
cout<<"复制构造函数"<<endl;
number = t.getnumber();
return *this;
}

Test &operator++(int){
cout<<"后置运算符被调用 : "<<endl;
Test temp = *this;
cout<<"Test temp = *this => "<<"temp的地址 : "<<&temp<<" "<<"this的地址: "<<this<<endl;
number++;
cout<<"temp.getnumber() => "<<temp.getnumber()<<endl;
return temp;
}

friend ostream&operator<<(ostream &os, const Test &t){
cout<<"输出运算符获得的对象地址 : "<<&t<<" 调用类型 : "<<"& - cout"<<endl;
cout<<"输出 : "<<t.getnumber();
return os;
}
friend ostream&operator<<(ostream &os, const Test &&t){
cout<<"&& - cout"<<endl;
cout<<"cout : "<<t.getnumber();
return os;
}
};
int main()
{
Test test01(100);
cout<<(test01++)<<endl;
return 0;
}



好失败...这个结果错了,我有一个问题:
temp为什么这么快就被析构了(Test test = test01;cout<<test; 这样结果就是对了啦),那么temp作为右值的它,不是应该被ostream&operator<<(ostream &os, const Test &&t)调用么 ,

占用大家时间啦,麻烦大家帮帮我解决这个问题,谢谢了
...全文
209 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
0x554 2015-08-24
  • 打赏
  • 举报
回复
恩恩,问题解决了,谢谢大家
0x554 2015-08-24
  • 打赏
  • 举报
回复
引用 3 楼 ant2012 的回复:
返回局部变量,当执行return temp;时,程序会将temp传给一个临时变量,如果调用者有Test test = test01++;有赋值或初始化操作,程序会将这个临时变量先传给被赋值者,然后才释放临时变量 cout<<test01++; 这个是传进去了,只不过传给cout<<是没有执行++操作的对象(后置++)
有点懂了,但是我加了括号cout<<(test01++)<<endl; 这样(test01++)应该返回的就是temp这个临时变量了吧,这个temp为什么传不进cout<< 呀.....
二班的码农 2015-08-24
  • 打赏
  • 举报
回复
引用 2 楼 lileihuilileihui 的回复:
这个....是怎么个被析构法的呢; 是在调用完后operator++()被析构的这我也能理解,局部变量嘛; 但是这样的话Test test = test01++; 右侧的temp也被析构了,理应也是赋值不过去的吧. 就算行的话 那为什么cout<<test01++; test01就传不进ostream&operator<<(ostream &os, const Test &&t)这个专门为右值准备的函数呢 [quote=引用 1 楼 ant2012 的回复:] temp为什么这么快就被析构了 temp为局部变量,函数调用完就结束释放了 test01++ 是后置++,表达式的值为++之前的值,也就是说先返回值,再++ 楼主要明白前置和后置的区别 (Test test = test01;cout<<test; 这样结果就是对了啦) 不管前置++,还是后置++,变量都会执行+1操作(除非重载改变其功能)
[/quote] 返回局部变量,当执行return temp;时,程序会将temp传给一个临时变量,如果调用者有Test test = test01++;有赋值或初始化操作,程序会将这个临时变量先传给被赋值者,然后才释放临时变量 cout<<test01++; 这个是传进去了,只不过传给cout<<是没有执行++操作的对象(后置++)
0x554 2015-08-24
  • 打赏
  • 举报
回复
这个....是怎么个被析构法的呢; 是在调用完后operator++()被析构的这我也能理解,局部变量嘛; 但是这样的话Test test = test01++; 右侧的temp也被析构了,理应也是赋值不过去的吧. 就算行的话 那为什么cout<<test01++; test01就传不进ostream&operator<<(ostream &os, const Test &&t)这个专门为右值准备的函数呢
引用 1 楼 ant2012 的回复:
temp为什么这么快就被析构了 temp为局部变量,函数调用完就结束释放了 test01++ 是后置++,表达式的值为++之前的值,也就是说先返回值,再++ 楼主要明白前置和后置的区别 (Test test = test01;cout<<test; 这样结果就是对了啦) 不管前置++,还是后置++,变量都会执行+1操作(除非重载改变其功能)
二班的码农 2015-08-24
  • 打赏
  • 举报
回复
temp为什么这么快就被析构了 temp为局部变量,函数调用完就结束释放了 test01++ 是后置++,表达式的值为++之前的值,也就是说先返回值,再++ 楼主要明白前置和后置的区别 (Test test = test01;cout<<test; 这样结果就是对了啦) 不管前置++,还是后置++,变量都会执行+1操作(除非重载改变其功能)
赵4老师 2015-08-24
  • 打赏
  • 举报
回复
运算符重载是语法糖。 语法糖越甜,编译调试查错越苦! 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。
0x554 2015-08-24
  • 打赏
  • 举报
回复
哦,恩恩,这几天也在纠结返回应用的含义,原来还是错在这了. 我也一直弄不清返回引用和不返回引用的区别:查百度说什么为了持续可引用,我又测试了一下,发现有没有返回引用的情况下都是一样的,我都蒙圈了, 现在就觉得返回引用可以减少函数调用的消耗. 今天又有一个这个错误,真是傻傻分不清了, 大哥能否指点一下
引用 8 楼 a30037338 的回复:
// ++i A& operator++() { ++m_i; return *this; } // i++ const A operator++(int) { A tmp = *this; ++(*this); // Implemented by prefix increment return tmp; } 后自增返回的是一个右值, 你现在的问题只是错在返回了一个局部变量的引用。
此后三年 2015-08-24
  • 打赏
  • 举报
回复
// ++i A& operator++() { ++m_i; return *this; } // i++ const A operator++(int) { A tmp = *this; ++(*this); // Implemented by prefix increment return tmp; } 后自增返回的是一个右值, 你现在的问题只是错在返回了一个局部变量的引用。
0x554 2015-08-24
  • 打赏
  • 举报
回复
那这样不行的话,那怎么实现cout<<(test01++)<<endl; 呢,我重载了一个右值的引用的cout<<可还是没用呀.
引用 5 楼 iyomumx 的回复:
你的运算符返回了一个局部变量的引用,属于未定义行为 temp的生存周期在operator++(int)结束同时结束,所以调用完就析构了,只留下一个非法引用作为返回值
二班的码农 2015-08-24
  • 打赏
  • 举报
回复
引用 4 楼 lileihuilileihui 的回复:
[quote=引用 3 楼 ant2012 的回复:] 返回局部变量,当执行return temp;时,程序会将temp传给一个临时变量,如果调用者有Test test = test01++;有赋值或初始化操作,程序会将这个临时变量先传给被赋值者,然后才释放临时变量 cout<<test01++; 这个是传进去了,只不过传给cout<<是没有执行++操作的对象(后置++)
有点懂了,但是我加了括号cout<<(test01++)<<endl; 这样(test01++)应该返回的就是temp这个临时变量了吧,这个temp为什么传不进cout<< 呀.....[/quote] 如五楼所说,在函数中尽量不要返回局部变量的引用和指针
iyomumx 2015-08-24
  • 打赏
  • 举报
回复
你的运算符返回了一个局部变量的引用,属于未定义行为 temp的生存周期在operator++(int)结束同时结束,所以调用完就析构了,只留下一个非法引用作为返回值

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧