美文网首页Exceptional C++
【Exceptional C++(7)】代码的复杂性(一)

【Exceptional C++(7)】代码的复杂性(一)

作者: downdemo | 来源:发表于2018-01-29 09:28 被阅读2次

    问题

    • 下列代码包含多少条执行路径
    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语句中所有条件都被求值

    相关文章

      网友评论

        本文标题:【Exceptional C++(7)】代码的复杂性(一)

        本文链接:https://www.haomeiwen.com/subject/pfntzxtx.html