static_cast、reinterpret_cast、const_cast和dynamic_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