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