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

返回类的对象的引用 有关问题

2012-03-28 
返回类的对象的引用 问题#include iostream.hclassN{public:N(inti,intj){xiyj}intGetxy(){returnx+

返回类的对象的引用 问题
#include <iostream.h>
class   N
{
public:
        N(int   i,int   j)
        {
                x=i;
                y=j;
        }
        int   Getxy()
        {
                return   x+y;
        }
private:
        int   x,y;
};
N   &fun();
void   main()
{
        N   p(18,25);
        fun()=p;
        cout < <fun().Getxy() < <endl;
}
N   &fun()
{
        N   a(23,45);
        return   a;
}
结果是:-857748508,为什么不是68呢?

我的想法:

想法一:return返回的一个类N对象的引用,而fun()=p则对这个对象赋值了,所以对象中的(23,45)被换成了(18,25),结果应该是68才对啊!

想法二:在fun()函数返回前a已经被释放了,所以a   实际上是个空对象,即便如此,在p给它赋值后a里面的x,y也应该有新值才对啊,所以结果也该是68啊

上面两个想法虽然结果一样,但本质不一样:一个是返回了对象中x,y有值;一个是返回个空对象。这两种想法哪个更对呢?那为什么结果不是68呢,谢谢各位大侠

[解决办法]
N &fun()
{
N a(23,45);
return a; // !!! 返回局部对象的引用,错。
}
局部对象a的生命周期只限于本函数体,出了函数后,将是一个不可知的对象。
[解决办法]
服了
void main()
{
N p(18,25);
// fun()本身返回一个临时对象的引用,生命期已结束,再将p赋给这个已经死亡的临时对
// 象?
fun()=p;

//一样,这里的fun()又返回一个临时对象的引用,死亡了还让它说话?
cout < <fun().Getxy() < <endl;
}
[解决办法]
将所有分给我,我告诉你答案(*^__^*) 嘻嘻…….

引用并不复制对象,只是返回对象的一个别名(相当于原来的对象).
指针只是传递对象的地址,也不拷贝对象本身, 因此这个对象依然是原来的对象.

而函数内部的对象是会自动清理的.除非他是new 出来的.

结合a+b, 返回引用或者指针, 他所代表的对象,是已经被销毁的,所以就是错误的用法.

return i; 这个返回是是引用还是指针? 这个返回的类型是int, 他会发成拷贝操作,也就是就算你销魂了函数里面的对象,他也没所谓, 因为他已经拷贝新的返回了.而这个返回的临时对象,又通过

int i;
i=fun(); //返回临时的int 对象, 在这行之后销毁,但是在这行已经将值复制到i中.所以销毁这个临时对象对i没影响.

-------------------------------------------

这里应该注意的一点,就是引用和指针这种间接性的返回, 他还是指向函数内的对象这点,他不是拷贝新的对象回去,因此函数内的对象如果销毁,程序必然出错.



[解决办法]
就没有传入实参呀,函数为实参在栈中构造了一份拷贝,叫形参。

热点排行