了解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”之间的差异

函数参数和exceptions的传递方式有3种:by value    by reference   by pointer

当我们调用的是一个函数,控制权最终会回到调用端。但当你抛出一个异常,控制权不会再回来抛出端。

istream operator>>(istream& s, Widget& w);

void passAndThrowWidget()

{

Widget localWidget;

cin>>localWidget;

throw localWidget;

}

C++特别声明,一个对象被抛出作为exception时,总是会发生复制。

void passAndThrowWidget()

{

static Widget localWidget;

cin>>localWidget;

throw localWidget;

}

若此exception以by reference方式捕捉,catch端还是不可能修改localWidget,只能修改localWidget的副本。注定后者比前者慢,因为有一个复制的过程。

 

class Widget{...};

class SpecialWidget : public Widget{ ... };

void passAndThrowWidget()

{

SpecialWidget localSpecialWidget;

....

Widget& rw = localSpecialWidget;//rw代表一个SpecialWidget

throw rw;//抛出一个类型为Widget的exception

}

C++中的复制动作总是永远是以对象的静态类型为本。

 

catch( Widget& w)

{

...

throw;

}

catch( Widget& w)

{

.....

throw w;

}

前者 重新抛出当前的exception,后者抛出的是当前exception的副本。

第一语句块重新抛出当前的exception,不论其类型为何。更明确地说如果最初抛出的exception的类型是SpecialWidget,第一语句块会传播一个SpecialWidget

exception---甚至虽然w的静态类型是widget.这是因为当此exception被重新抛出时,并没有发生复制行为。第二catch语句块则抛出一个新的exception,其类型总是

widget,因为那是w的静态类型。

 

函数调用过程中将一个临时对象传递给一个non-const-reference参数是不允许的。但对exceptions则属合法。

虚函数采用的是best fit策略,而exception处理机制确是first fit。

总结,3个主要的差异:

1、是否复制;

2、类型转换;

3、匹配顺序;

 

More Effective C++---12th

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验2 异常 在实验1基础上, 定义一个异常类ScoreException,当输入的学生成绩不在[0,100]区间时,抛出异常。 定义一个异常类StudentNumberException,当输入的学号不满足下述条件,则抛出异常。条件为:??学号为11位??(学号为10位),第1位为2,第2位为0,其余位为数字0~9. 对Student和StudentTest类进行必要修改,提升程序的健壮性。 StudentTest类运行效果如下: 测试用例1: 请输入学生学号:2011211301 请输入学生姓名:王晓 请输入学生三门课成绩(数学,英语,科学):88,79,90 学生信息如下: 学号:2011211301 姓名:王晓 数学成绩:88 英语成绩:79 科学成绩:90 平均成绩:85.66666666666667 测试用例2: 请输入学生学号:1011211301 学号格式不正确,请重新输入 请输入学生学号:101121130x 学号格式不正确,请重新输入 请输入学生学号:2011211301 请输入学生姓名:王晓 请输入学生三门课成绩(数学,英语,科学):88,179,90 成绩数据有误,请重新输入 请输入学生三门课成绩(数学,英语,科学):88,-79,90 成绩数据有误,请重新输入 请输入学生三门课成绩(数学,英语,科学):88,79,90 学生信息如下: 学号:2011211301 姓名:王晓 数学成绩:88 英语成绩:79 科学成绩:90 平均成绩:85.66666666666667 作业命名: _学号(8位)_姓名_第几次作业(1位)_类名.java eg: _09211195_王晓_1_Student.java //定义Student类 _09211195_王晓_1_StudentList.java //定义StudentList类 为便于作业批改和查找,上传作业的时候,传.java文件,不要上传压缩包,一次作业可以有多个.java文件 为便于作业批改,要求源文件中的类名也需要和java文件名一致。如: public class _09211195_王晓_1_Student{ //略 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值