日期:2011-03-22 13:55:00 来源:本站整理
C++中理解"传送参数"和非常之间的差别[VC/C++编程]
本文“C++中理解"传送参数"和非常之间的差别[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++标准要求被做为非常抛出的对象必须被复制.
以上是“C++中理解"传送参数"和非常之间的差别[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论