复习了C++类型转换,看见网上有总结精辟的文章,故而摘抄一把。
相当于传统的的C 语言里的强制转换,该运算符把expression转换为new_type类型,用来强迫隐式转换,例如non-const对象转为const对象,编译时检查,多余非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性。它主要由以下几种用法:
1、用于类层次结构中基类(父类)和派生类(子类)之间指针或引用转换;
1)进行上行转换(把派生类的指针或引用转换为基类表示)是安全的
2)机型下行转换(把基类指针或引用转换为派生类表示)时,由于没有动态类型检查,所以是不安全的。
2、用于基本数据类型之间的转换,如把int转换为char,把char转换为enum。这种转换的安全性也要开发人员来保证。
3、把空指针转换为目标类型的空指针
4、把任何类型的表示式转换为void类型。
char a = 'a';
int b = static_cast(a); //正确,将char型设计转换为int型数据
double * c = new double;
void * d = static_cast(c) ; //正确,将double指针转换为void指针
int e = 10;
const int f = static_cast(e); // 正确,将int型数据转换为const int型数据
const int g = 20;
int *h = static_cast(&g);//编译错误,static_cast不能转换掉g的const属性
类的上行和下行转换
if(Derived *dp = static_cast(bp)){ //下行转换是不安全的
// 使用dp指向的Derived对象
}
else
{
//使用dp指向的Base对象
}
if(Base *bp = static_cast(dp)){ //上行转换是安全的
//使用bp指向Derived对象
}
else
{
//使用dp指向Base对象
}
形式:
dynamic_cast
dynamic_cast
dynamic_cast
type 必须是一个类类型,在第一种形式中,type必须是一个有效的指针,第二种形式中,type必须是一个左值,在第三种形式中,type必须是一个右值。在上面所有形式中,e的类型必须符合以下三个条件中的任何一个:
1、e的类型是目标类型type的公有派生类
2、e的类型是目标type的公有基类或者e的类型就是目标type的类型
3、如果一条dynamic_cast语句的转换目标是指针类型并且失败了,则结果为0,如果转换目标是引用类型并且失败了,则dynamic_cast运算符将抛出一个std::bad_cast异常(该异常定义在typeinfo标准头文件中)。e也可以是一个空指针,结果是所需类型的空指针。
注意:dynamic_cast 主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换(cross cast)。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。dynamic_cast是唯一无法有就是语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。
(1) 指针类型
if(Derived *dp = dynamic_cast(bp)){
//使用dp指向的Derived对象
}
else{
//使用bp指向的Base对象
}
(2) 引用类型
因为不存在所谓的空引用,所以引用类型的dynamic_cast转换与指针类型不同,在引用转换失败时,会抛出std::bad_cast异常,该异常定义头文件typeinfo中
void fun(const Base &b){
try{
const Derived &d = dynamic_cast(b);
//使用b引用的Derived对象
}
catch(std::bad_cast){
//处理类型转换失败的情况
}
}
const_cast,用于修改类型的const或volatile属性。
该运算符用来修改类型的const(唯一有次能力的C++ style转换操作符)或volatile属性,除了const或volatile修饰之外,new_type和expression的类型是一样的。
1、常量指针被转化成非常量的指针,并且仍然指向原来的对象。
2、常量引用被转换为非常量的引用,并且仍然指向原来的对象。
3、const_cast一般用于修改底指针,如const char * p形式。
const int g = 20;
int *h = const_cast(&g); // 去掉const常量const属性
const int g = 20;
int &h = const_cast(g) ; //去掉const引用const属性
const char * g="hello";
char *h = const_cast(g) ; //去掉const指针const属性
new_type 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换为一个整型,也可以吧一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换为原类型的指针,还可以得到原先的指针)。
reinterpret_cast意图执行低级转换、实际动作(及结果)可能取决于编辑器、这也就表示它不可移植。
#include
using namespace std;
int output(int p){
cout << p <(&p);
fun2(p); // error
return 0;
}