进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 程序开发 -> VC -> 文章内容  
C++中理解“传递参数”和异常之间的差异

从语法上看,在函数里声明参数与在catch子句中声明参数几乎没有什么差别:

class Widget { ... }; //一个类,具体是什么类
// 在这里并不重要
void f1(Widget w); // 一些函数,其参数分别为
void f2(Widget& w); // Widget, Widget&,或
void f3(const Widget& w); // Widget* 类型
void f4(Widget *pw);
void f5(const Widget *pw);
catch (Widget w) ... //一些catch 子句,用来
catch (Widget& w) ... //捕获异常,异常的类型为
catch (const Widget& w) ... // Widget, Widget&, 或
catch (Widget *pw) ... // Widget*
catch (const Widget *pw) ...

  你因此可能会认为用throw抛出一个异常到catch子句中与通过函数调用传递一个参数两者基本相同。这里面确有一些相同点,但是他们也存在着巨大的差异。

  让我们先从相同点谈起。你传递函数参数与异常的途径可以是传值、传递引用或传递指针,这是相同的。但是当你传递参数和异常时,系统所要完成的操作过程则是完全不同的。产生这个差异的原因是:你调用函数时,程序的控制权最终还会返回到函数的调用处,但是当你抛出一个异常时,控制权永远不会回到抛出异常的地方。

  有这样一个函数,参数类型是Widget,并抛出一个Widget类型的异常:

// 一个函数,从流中读值到Widget中
istream operator>>(istream& s, Widget& w);
void passAndThrowWidget()
{
 Widget localWidget;
 cin >> localWidget; //传递localWidget到 operator>>
 throw localWidget; // 抛出localWidget异常
}

  当传递localWidget到函数operator>>里,不用进行拷贝操作,而是把operator>>内的引用类型变量 w指向localWidget,任何对w的操作实际上都施加到localWidget上。这与抛出localWidget异常有很大不同。不论通过传值捕获异常还是通过引用捕获(不能通过指针捕获这个异常,因为类型不匹配)都将进行lcalWidget的拷贝操作,也就说传递到catch子句中的是 localWidget的拷贝。必须这么做,因为当localWidget离开了生存空间后,其析构函数将被调用。如果把localWidget本身(而不是它的拷贝)传递给catch子句,这个子句接收到的只是一个被析构了的Widget,一个Widget的“尸体”。这是无法使用的。因此C++规范要求被做为异常抛出的对象必须被复制。

  即使被抛出的对象不会被释放,也会进行拷贝操作。例如如果passAndThrowWidget函数声明localWidget为静态变量(static),

void passAndThrowWidget()
{
 static Widget localWidget; // 现在是静态变量(static);
 //一直存在至程序结束
 cin >> localWidget; // 象以前那样运行
 throw localWidget; // 仍将对localWidget
} //进行拷贝操作


  当抛出异常时仍将复制出localWidget的一个拷贝。这表示即使通过引用来捕获异常,也不能在catch块中修改localWidget;仅仅能修改localWidget的拷贝。对异常对象进行强制复制拷贝,这个限制有助于我们理解参数传递与抛出异常的第二个差异:抛出异常运行速度比参数传递要慢。www.goodsgy.com

www.goodsgy.com

[1] [2] [3]  下一页

在百度中搜索:C++中理解“传递参数”和异常之间的差异
在Google中搜索:C++中理解“传递参数”和异常之间的差异
在Yahoo中搜索:C++中理解“传递参数”和异常之间的差异

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· SPARC中如何安装Linux系统
· C++中禁止异常信息传递到析构函数外
· 在C++中审慎使用异常规格
· C++中巧用#define访问类的私有成员
· VC中利用MFC设计绘图程序初步
· 深入理解C++中的mutable关键字
· 在VC中链接动态链接库的方法简要说明
· C++中要求(或禁止)对象产生于heap中
· 在VC中实现画任意方向
· C++中运算符优先级的学习注解
 
· VC实现系统热键激活后台服务程序
· SEO:关于baidu一些排名规则的讨论
· More Effective C++:不要重载的操作符
· VC利用boost库解析正则表达式
· [图文] 用VC实现对超长数据库字段的操作
· More Effective C++:防止资源泄漏
· 用VC#2005解析含有多种格式的文本文件
· C++中禁止异常信息传递到析构函数外
· [图文] Visual C# 2005实现控件中捕获按键..
· C++中理解“传递参数”和异常之间的差异

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:good_sgy@tom.com  
MSN:goodsgy@hotmail.com