【Exceptional C++(7)】代码的复杂性(一)
2018-01-29 本文已影响2人
downdemo
问题
- 下列代码包含多少条执行路径
String EvaluateSalaryAndReturnName(Employee e)
{
if (e.Title() == "CEO" || e.Salary() > 100000)
{
cout << e.First() << " " << e.Last() << " is overpaid" << endl;
}
return e.First() + " " + e.Last();
}
解答
- 3条普通路径和20条与异常有关的隐藏路径
- 1.若e.Title() == "CEO"则不用对第二个条件求值,cout被执行
- 2.若e.Title() != "CEO"但e.Salary() > 100000,两个条件都被求值,cout被执行
- 3.若e.Title() != "CEO"且e.Salary() <= 100000,cout不被执行
- 4.传值传参,调用Emplyee的拷贝构造函数,这个操作可能抛出异常;将函数临时的返回值拷贝到函数调用者的区域时,String的拷贝构造函数也可能抛出异常,不过这是在函数外部发生的,先忽略这种可能性
- 5.e.Title():成员函数Title()本身可能抛出异常,或者采用return by value返回class type对象,从而导致拷贝操作可能抛出异常
- 6.为了与operator==匹配,字符串"CEO"也许要转换成class type的临时对象,这个临时对象的构造过程可能抛出异常
- 7.如果operator==是程序员提供的函数,它可能抛出异常
- 8.e.Salary()与#5同理
- 9.e > 100000与#6同理
- 10.operator>与#7同理,如果是程序员提供的函数,它可能抛出异常
- 11.||与#7和#10同理,如果是程序员提供的函数,它可能抛出异常
- 12-16.五个对operator<<的调用可能抛出异常
- 17-18.与#5同理,First()和Last()可能抛出异常,或者可能因为返回临时对象在对象的构造过程中抛出异常
- 19-20.return语句中的First()和Last()同上
- 21.与#6同理,为了与operator+匹配,字符串" "也许要转换成class type的临时对象,这个临时对象的构造过程可能抛出异常
- 22-23.与#7同理,两个operator+如果是程序员提供的函数,它可能抛出异常
其他
- 决不允许异常从析构函数中渗透出来,否则代码无法工作
- 如果||是一个重载过的函数调用,短路求值规则被抑制,if语句中所有条件都被求值