c++四种强转类型的用法

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作为类类型转换有作语法逻辑检测。

记录完毕

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值