zoukankan      html  css  js  c++  java
  • C++ Primer Plus学习:第十五章

    第十五章 友元、异常和其他

    友元

    友元类

    0-1

    class Tv

    {

    public:

    friend class Remote;

    }

    Remote类可以使用Tv的数据成员,Remote类在Tv类后定义 。

    友元成员函数

    0-2

    class Tv; //前向声明

    class Remote

    {

    public:

    void chanup(Tv &t);

    }

    class Tv

    {

    public:

    friend void Remote::set_chan(Tv& t, int c);

    }

    异常处理

    对异常的处理有三个部分组成:

    • 引发异常
    • 使用处理程序捕获异常
    • 使用try块

    0-3

    try(z=hmean(x,y);)

    catch(bad_hmean & bg)

    {

    bg.mesg();

    continue;

    }

    catch(bad_gmean & hg)

    {

    cout<<hg.mesg();

    break;

    }

    double hmean(double a,double b)

    {

    if(a==-b)

    throw bad_hmean(a,b);

    return 2.0*a*b/(a+b);

    }

    double gmean(double a,double b)

    {

    if(a<0||b<0)

    throw bad_gmean(a,b);

    return std::sqrt(a*b);

    }

    发生异常后,返回到离语句最近的匹配的catch结构中,跳出的函数的自动变量被释放,类的析构函数被调用。

    exception类

    stdexcept类继承于基类exception类。定义了logic_error类和runtime_error类,公有派生。

    logic_error类中的错误类型:

    domain_error:定义域错误

    invalid_argument:无效变量

    length_error:没有足够空间。string的append操作空间不足

    out_of_bounds:索引错误

    runtime_error类:运行期间的错误

    range_error:计算结果不在函数允许的范围内,但是不是上溢或下溢错误。

    overflow_error:上溢错误,超过最大值

    underflow_error:下溢错误,小于最小的非零值

    RTTI(Runtime Type Identification)运行阶段类型识别-只适用于有虚函数的类,只有对于这种类的层次结构,才应该将派生对象的地址赋给基类指针。

    dynamic_cast运算符:最常用的RTTI组件

    Superb *pm=dynamic_cast<Superb *>(pg);

    若pg的类型能够被安全地转化为Superb*,如果可以,返回对象的地址,否则,返回一个空指针。

    dynamic_cast<Type*>(pt);正确,返回Type*,否则,返回0。

    typeid使得能够确定两个对象是否为同种类型,可接受两个参数:类名和结果为对象的表达式。返回值为type_info对象的引用。

    typeid(Magnificent)==typeid(*pg);

    pg为空指针会抛出异常bad_typeid。type_info含有name()函数,返回类名。

    const_cast<type-name> (expression) 转变为const或者volatile类型,typename与expression类型相同

    static_cast<type-name>(expression) type-name转化为expression或者expression转化为type-name时均可使用。枚举/整型互转,double/int互转。

    reinterpret_cast<type-name>(expression)

    函数指针不可转化为数据指针,指针不能转为整型或者浮点

  • 相关阅读:
    使用QT实现一个简单的登陆对话框(纯代码实现C++)
    vivado + hdmi+ddr3(2)--------基于VIVADO的DDR3三个时钟
    Verilog实现之任意分频电路
    Verilog实现之异步fifo
    vivado + hdmi+ddr3(1)--------HDMI接口协议介绍及实现
    verilog实现之同步FIFO
    FPGA 开发基础---------格雷码转二进制
    verilog之生成语句
    verilog 实现之RAM
    FPGA开发基础--------Handshake Protocol握手协议(1)
  • 原文地址:https://www.cnblogs.com/xyb930826/p/5267041.html
Copyright © 2011-2022 走看看