读书人

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

发布时间: 2012-10-19 16:53:35 作者: rapoo

为什么不能用过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参数是否是引用!
[解决办法]
临时对象而已
[解决办法]
改变临时对象干嘛,那个只是说明一些异常信息的

读书人网 >C++

热点推荐