C++四种强制类型转化

C++风格中的强制类型转化和C语言有一定区别,C++引入四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast四个关键字,可以更好的控制转换的过程,并且从风格上来说更加清楚直观的表达转换的类型,一目了然。

1. static_cast

用法: static_cast<类型说明符>(变量或表达式)
主要有一下几种用法
       1)用于结构层次中基类和派生类之间指针或引用的转换
       由下向上转换安全,由上向下转换没有动态类型检查,不安全。
       2)用于基本数据类型之间的转换,这种用法最常用,但需要发开人员保证转换的安全性
       3)把空指针转换成目标类型的空指针
       4)任何表达式转换成void类型
例如:

int num_a = 10;
int num_b = 20;
double num_c = static_cast<double>(num_a) 
				/ static_cast<double>(num_b);

2. const_cast

用法: cosnt_cast<类型说明符>(变量或表达式)
const用于修饰变量,表示该变量的值不可修改。
const_cast的作用是去掉这种特性,但其只作用于常数对象的指针或引用。
虽然可以操作,但通过const_cast操作常量变量的指针是一种无奈之举,应该尽量避免这种操作。
例子

const int a = 10;
const int * p = &a;
int *q = const_cast<int *>(p); // 不可以写const_cast<int>(a)
*q = 20; // a的值不会变

3. reinterpret_cast

用法: reinterpret_cast<类型说明符>(变量或表达式)
主要用途:
       1)改变指针或引用的类型
       2)将指针或引用转化为一个足够长度的整型
       3)将整型转化为指针或引用类型
该类型的转换仅为比特位的拷贝,所以常用于和指针有关的操作,使用时应谨慎。
例子

// socket本机地址结构体设置
struct sockaddr m_serverAddr;
struct sockaddr_in *serverAddr = reinterpret_cast<struct sockaddr_in *>(&m_serverAddr);
serverAddr->sin_family = AF_INET;
serverAddr->sin_port = htons(m_port);
serverAddr->sin_addr.s_addr = htonl(INADDR_ANY);

4.dynamic_cast

用法: reinterpret_cast<类型说明符>(变量或表达式)
注意:
       1)其他三种时编译时完成的,dynamic时运行时处理的。运行时进行类型检查
       2)不能用于内置的基本数据类型的强制转换
       3)dynamic转换成功返回的是指向类的指针或引用,失败会返回NULL
       4)使用dynamic转换时基类中一定有虚函数,否则编译不通过。
       5)向上转换时dynamic和static转换效果一致,向下转换时具有类型检查的功能,因此更安全。


此处仅索引记录。
参考文章:C++ 四种强制类型转换

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值