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

posted @ 2016-07-09 11:18  helloforworld  阅读(5805)  评论(0编辑  收藏  举报