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

Damn_boy 2012-08-03 11:17:17

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地址不是同一个
...全文
138 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2012-08-03
  • 打赏
  • 举报
回复
临时对象而已
wenhong609 2012-08-03
  • 打赏
  • 举报
回复
你这个理解错了,throw语句会产生一个临时对象,throw obj;比如这一句,实际上先要生成一个obj的临时对象,再将生成的这个临时对象抛出,即抛出的实际上不是obj,catch用引用可以避免再将这个临时对象再赋值给catch的参数。即,throw抛出的是一个临时对象,而不是源对象,不管catch参数是否是引用!
lylm 2012-08-03
  • 打赏
  • 举报
回复
不会啊!用vc6跟踪了一下,m_p变成0x11111111了;
另外const throwMe *p = &hm; 的地址是同一个
昵称很不好取 2012-08-03
  • 打赏
  • 举报
回复
改变临时对象干嘛,那个只是说明一些异常信息的

64,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧