C++几种强制转换类型
static_cast<>() 编译时检测语法:
1.用于基本数据类型之间的转换
2.用于基类指针或引用和子类指针或引用之间的转换
3,.把数据类型转换成空指针
4.把任何类型的表达式转换成void类型
dynamic_cast() 运行后检测语法;
里面必须是类的指针、类的引用或者void*。
强调的是类或者void*,例如不能放函数指针。
1.常用于基类指针或引用和子类指针或引用之间的转换
const_cast<>()
1.常量指针被转化成非常量的指针,并且仍然指向原来的对象;
2.常量引用被转换成非常量的引用,并且仍然指向原来的对象;
reinterpret_cast<>()
1.从指针类型到一个足够大的整数类型
2.从整数类型或者枚举类型到指针类型
3.从一个指向函数的指针到另一个不同类型的指向函数的指针
4.从一个指向对象的指针到另一个不同类型的指向对象的指针
5.从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
6.从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针
static_cast<>() eg:
1.char c = ‘a’;
int b = static_cast ©;
//父类指针指向子类内存空间没问题
Father *pf1 = new Son();
Son *ps1 = static_case<Son *>pf1;
//父类指针指向自己的内存空间会有安全隐患
2.Father* pf1 = new Father;
Son *ps1 = static_cast<Son *>(pf1);
ps:因为指针ps1指向的是父类内存空间,当指针访问子类独有的数据成员时程序不会报错,但是其实访问的是一片未受控制的内存(当存在父类和子类转换时最好用dynamic_cast,它会检查符不符合语法规则,不符合会返回一个空指针)
3.double a = 100;
void * p = static_cast(void *)(a);
//非const强转const
4.double b = 100;
const double c = static_cast(b);
//编译时报错,不能将const强转非const
5.const double c = 100;
double d = static_cast©;
if(Derived *dp = dynamic_cast<Derived *>(bp)){
//使用dp指向的Derived对象
}
else{
//使用bp指向的Base对象
}
dynamic_cast<>() eg:
Father fp1;
//子类指向父类内存 , 存在sp1访问fp1内存中没有的变量或者函数的安全隐患
if( !(Son sp1 = dynamic_cast<Son *>(fp1))){
fp1 = new son(); // 让父类指针指向子类
}
else{
fp1 = new Father();
}
const_cast<>() eg:
const int a = 100;
int * b = const_cast<int *>(&a);
const int c = 100;
int &d = const_cast<int &>©;//去掉const引用const属性
const char *e= “hello”;
char *f = const_cast<char *>(e);//去掉const指针const属性
reinterpret_cast<>()eg
reinterpret_cast功能十分强大,它甚至可以将基本类型转为函数类型,但是因为认识交浅,实际上也没用过,下面这个只是做个演示。
int output(int p){
cout << p <<endl;
return 0;
}
typedef int (*test_func)(int );//定义函数指针test_func
int p = 10;
test_func fun1 = reinterpret_cast<test_func>(&p);//将p强转为函数指针类型
fun2§;//…处有未经处理的异常: 0xC0000005: Access violation
总结:static_cast一般常用于基本类型的转换,类转换最好用dynamic_cast,虽然static_cast也可以作为类类型转换,但是需要人为确保它书写的准确性,dynamic_cast作为类类型转换有作语法逻辑检测。
记录完毕