• C++11强制类型转换、异常处理


    static_cast、reinterpret_castconst_castdynamic_cast

    1.static_cast

    • 用来进行比较“自然”和低风险的转换,比如整形和实数型、字符型之间互相转换。
    • 不能在不同类型类型的指针之间互相转换,也不能用于整型和指针之间的互相转换,也不能用于不同类型的引用之间的转换。

    2.reinterpret_cast

    • 用来进行各种不同类型的指针之间的转换、不同类型的引用之间转换、以及指针和能容纳得下指针的整数类型之间的转换。转换的时候,执行的是逐个比特拷贝的操作。

    3.const_cast

    • 用来进行去除const属性的转换。将const引用转换成同类型的非const引用,将const指针转换为同类型的非const指针时用它。

    4.dynamic_cast

    • 专门用于将多态基类的指针或引用,强制转换为派生类的指针或引用,而且能够检查转换的安全性。对于不安全的指针转换,转换结果返回NULL。
    • 不能用于将非多态基类的指针或引用,强制转换为派生类的指针或引用。

    异常处理

    通常的做法是:在预计会发生异常的地方,加入相应的代码,但是这种做法并不总是适用的。

    …//对文件A进行了相关的操作

    fun(arg , …);//可能发生异常

    …….

    用try、catch处理异常

    如果一个函数在执行的过程中,抛出的异常在本函数内就被catch块捕获并处理了,那么该异常就不会抛给这个函数的调用者(也称“上一层的函数”);如果异常在本函数中没被处理,就会被抛给上一层的函数。

    C++标准异常类

    • C++标准库中有一些类代表异常,这些类都是从exception类派生而来。常用的几个异常类如下:

     

    • bad_cast

    在用dynamic_cast进行从多态基类对象(或引用)到派生类的引用的强制类型转换时,如果转换是不安全的,则会抛出异常。

    • bad_allo

    在用new运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常。

    • out_of_range

    用vector或string的at成员函数根据下标访问元素时,如果下标越界,就会抛出此异常。

    下面是一个类型转换异常的小例子:

    #include <iostream>
    
    using namespace std;
    
    class Base
    {
    private:
        int value;
    public:
        virtual void print()
        {
            cout << "Hello world" << endl;
        }
        Base(int value) :value(value) {};
    };
    
    class Derived :public Base
    {
    public:
        void print()
        {
            cout << "hehh" << endl;
        }
    };
    int main()
    {
        Base b(4);
        try
        {
            Derived & p = dynamic_cast<Derived &>(b);
        }
        catch (bad_cast & e)
        {
            cerr << e.what() << endl;
        }
        return 0;
    }

    程序运行结果:

     

     参考链接:

    https://www.coursera.org/learn/cpp-chengxu-sheji

  • 相关阅读:
    HBase 异步查询导致的死锁和zookeeper通信中断问题追踪与总结[非技术]
    [读书笔记]代码整洁之道读书笔记
    HBase行锁与MVCC分析
    进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿
    上周回顾 - 2012年11.26-12.4
    2012年一个屌丝程序员的学习总结:读书、户外、泡妞、习惯、母猪产后护理
    C#_WinForm接收命令行参数
    SQL常识
    集成.Net / Flex3 & FluorineFX — Part II: The Client
    DB2基本概念
  • 原文地址:https://www.cnblogs.com/helloforworld/p/5655502.html
Copyright © 2020-2023  润新知