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

为何不能用过catch里的引用改变throw传递的参数

2012-10-19 
为什么不能用过catch里的引用改变throw传递的参数?C/C++ codeclass throwMe{public:throwMe(throwMe *p){m

为什么不能用过catch里的引用改变throw传递的参数?

C/C++ code
class throwMe{public:    throwMe(throwMe *p){m_p = p;}    ~throwMe(){};    void SetHandle(throwMe *p){m_p = p;}private:    throwMe *m_p;};int _tmain(int argc, _TCHAR* argv[])    {        throwMe obj(NULL);    try{                throwMe *p = &obj;        throw obj;   //throwMe(&obj);    }    catch(/*const*/ throwMe &hm)    {        const throwMe *p = &hm;           //c++ primer P584           //如果catch的参数的引用 则不存在单独的catch对象            //catch的形参所做的改变将作用在throw的对象上        hm.SetHandle((throwMe *)0x11111111);    }    return 0;}

throw的obj是try-catch外部的对象
catch部分的参数是引用
在catch里重置了handle但是断点后看到的obj内部的m_p成员并没有改变

是我理解有问题还是什么?

还有一个
catch内部 const throwMe *p = &hm; 得到的地址和外部的obj地址不是同一个

[解决办法]
不会啊!用vc6跟踪了一下,m_p变成0x11111111了;
另外const throwMe *p = &hm; 的地址是同一个
[解决办法]
你这个理解错了,throw语句会产生一个临时对象,throw obj;比如这一句,实际上先要生成一个obj的临时对象,再将生成的这个临时对象抛出,即抛出的实际上不是obj,catch用引用可以避免再将这个临时对象再赋值给catch的参数。即,throw抛出的是一个临时对象,而不是源对象,不管catch参数是否是引用!
[解决办法]
临时对象而已
[解决办法]
改变临时对象干嘛,那个只是说明一些异常信息的

热点排行