一个有趣的对象生灭有关问题和重载操作符有关问题,解决有重谢!
一个有趣的对象生灭问题和重载操作符问题,解决有重谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
这一句
的执行结果是:
Copy!
Copy!
Radio dies!
1/2
Radio dies!
①现在第一个问题就来了:前4句我都能知道为什么输出,可是最后一句是怎么回事?同一个对象die了2次吗?
设置了单步运行后发现好像是ostream内部输出来的,可是为什么啊?
②第二个问题是: 这一句
因为是后++,所以我认为应该先是y=three,再执行y++,结果应为3/2;
可是输出的结果却是y=5/2;
为什么啊?是我代码写得不对吗?
初学c++小白一枚,还望各大神多多指教!
------解决思路----------------------
1. ++产生了临时对象,就是里面的temp
2. y++得到的是右值,赋值没有意义, 这语句可以这样看 temp=y , y++, temp=three
------解决思路----------------------
问题1:既然两次copy,当然有两次die:
------解决思路----------------------
实际上是:
很明显要先调用operator++(int),然后再调用 operator=(Ratio const &)。three被赋值给y.operator++(int)的返回值,这是一个临时对象,在这条语句结束后,这个临时对象就被释放了。因此这个赋值其实 是个无效操作。
#include<iostream>
using namespace std;
class Ratio{
friend ostream& operator<<(ostream&,const Ratio&);
private:
int num,den;
public:
Ratio(int n=1,int d=1):num(n),den(d){cout<<"Radio lives!"<<endl; };
Ratio(const Ratio& r):num(r.num),den(r.den),id(r.id){cout<<"Copy!"<<endl; };
~Ratio(){cout<<"Radio dies!"<<endl; };
Ratio& operator=(const Ratio&);
Ratio& operator++();
Ratio operator++(int);
};
Ratio& Ratio::operator ++(){
num+=den;
return *this;
}
Ratio Ratio::operator ++(int i){
Ratio temp=*this;
num+=den;
return temp;
}
Ratio& Ratio:: operator=(const Ratio& r){
num=r.num;
den=r.den;
cout<<"Overwrite = !"<<endl;
return *this;
}
ostream& operator<<(ostream& o,const Ratio& r){
o<<r.num<<"/"<<r.den;
return o;
}
void main(){
Ratio one(1,2);
Ratio three=one;
Ratio y=one;
cout<<y++<<endl;
y++=three;
cout<<y<<endl;
}
这一句
cout<<y++<<endl;
的执行结果是:
Copy!
Copy!
Radio dies!
1/2
Radio dies!
①现在第一个问题就来了:前4句我都能知道为什么输出,可是最后一句是怎么回事?同一个对象die了2次吗?
设置了单步运行后发现好像是ostream内部输出来的,可是为什么啊?
②第二个问题是: 这一句
y++=three;
因为是后++,所以我认为应该先是y=three,再执行y++,结果应为3/2;
可是输出的结果却是y=5/2;
为什么啊?是我代码写得不对吗?
初学c++小白一枚,还望各大神多多指教!
------解决思路----------------------
1. ++产生了临时对象,就是里面的temp
2. y++得到的是右值,赋值没有意义, 这语句可以这样看 temp=y , y++, temp=three
------解决思路----------------------
问题1:既然两次copy,当然有两次die:
Ratio Ratio::operator ++(int i){
Ratio temp=*this;//第一次copy:拷贝构造temp
num+=den;
return temp;//第二次copy:拷贝构造临时对象
}//第一次die:释放temp;
.....
cout<<y++<<endl;
//第二次die:释放临时对象。
------解决思路----------------------
y++=three;
实际上是:
y.operator ++(0).operator=(three);
很明显要先调用operator++(int),然后再调用 operator=(Ratio const &)。three被赋值给y.operator++(int)的返回值,这是一个临时对象,在这条语句结束后,这个临时对象就被释放了。因此这个赋值其实 是个无效操作。