一.强制类型转换
C++语言中提供了static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于强制类型转换的。?
二.static_cast
1.基本数据之间的转换,如int转化为double
int a = 1;double b = static_cast<double>(a);
2.用于类层次结构中基类和派生类之间指针或引用的转换
①进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
②进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的
//写两个类,假如 Derive类继承BasicBasic *b = nullptr;Derive *d = new Derive;b = static_cast<Basic *> d;
3.把空指针转换成目标类型的空指针
int *p;void *m = malloc(sizeof(int));p = static_cast<int *>m;
4.把任何类型的表达式转换为void类型?
三.const_cast
cost_cast即用于强制转换指针或者引用的const或volatile限制,特别注意的是,const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用。
//错误例子const int a = 2;int b = const_cast<int>a; //错误,const_cast强制转换的对象必须是指针或引用//正确例子int c = 2;const int *d = &c;int *e = const_cast<int *>d;
四.reinterpret_cast?
reinterpret_cast运算符用于处理无关类型之间的转换,他会产生一个新的值,这个值会有与原始参数(原数据类型)有完全相同的比特位。
1.从指针类型到一个足够大的整数类型
2.从整数类型或者枚举类型到指针类型
3.从一个指向函数的指针到另一个不同类型的指向函数的指针
4.从一个指向对象的指针到另一个不同类型的指向对象的指针
5.从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
6.从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针
五.dynamic_cast
1.前面三种都是编译时完成的强制转换,dynamic_cast是运行时处理的。
2.不能用于内置的基本数据类型的强制转换。
3.dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
4.使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
5.在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
使用dynamic_cast进行向下强制类型转换。使用此关键字有以下几个条件:
①.必须有虚函数
②.必须打开编译器的RTTI开关
③.必须有继承关系?
97457521