首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这个程序按理说应该是异常的,因为返回一个指向该局部对象的引用,但是输出为什么是正确的

2013-02-24 
这个程序按理说应该是错误的,因为返回一个指向该局部对象的引用,但是输出为什么是正确的?#includeiostrea

这个程序按理说应该是错误的,因为返回一个指向该局部对象的引用,但是输出为什么是正确的?


#include<iostream>
using namespace std;
class T
{
public:

void Seta(int init)
{
a=init;
}
int get()const
{
return a;
}
T &operator+(const T &rhs) //正确的写法是T operator+(const T &rhs)
{
T temp;
temp.Seta(a+rhs.get());
return temp;
}
private:
int a;
};
int main()
{
T obj,obj1,obj2;

obj.Seta(1);
obj1.Seta(2);

obj2=obj+obj1;

cout<<obj2.get()<<endl;
return 0;
}


这个程序的运行结果会输出3.一个正确的结果。我本来觉得它应该会输出错误的结果才对呀,为什么它在函数结束时已经被销毁,还能得出正确的结果,太让人困惑了。
[解决办法]
返回局部对象的引用肯定是错误的,至于结果是正确的,可能是由于局部对象的储存空间被释放后还没有被其他东西使用(覆盖)。
[解决办法]
obj2=obj+obj1;
这里应该调用了复制构造函数。构造出的obj2还在生存周期内
[解决办法]
引用:
C/C++ code
?



1

obj2=obj+obj1;这里应该调用了复制构造函数。构造出的obj2还在生存周期内

额,返回时确实析构掉了,如1L所说,只是这是的内存没有被其它地方使用,还保持原来的值

热点排行