博客
关于我
C++类型转换总结
阅读量:431 次
发布时间:2019-03-06

本文共 1435 字,大约阅读时间需要 4 分钟。

C++风格的类型转换提供了四种类型转换操作符,分别适用于不同的场景。以下是对每种转换的详细分析:

1. const_cast

const_cast 用于去掉类型的 const 或 volatile 属性。例如:

struct SA {    int i;};const SA ra;// ra.i = 10; 直接修改 const 类型,编译错误SA & rb = const_cast
(ra);rb.i = 10; // 可以正常修改

2. static_cast

static_cast 类似于 C 风格的强制转换,无条件转换,适用于基本类型和类之间的转换。例如:

int n = 6;double d = static_cast
(n); // 基本类型转换int* pn = &n;double* d = static_cast
(pn); // 无关类型指针转换,编译错误void* p = static_cast
(pn); // 任意类型转换成 void 类型

3. dynamic_cast

dynamic_cast 用于动态类型转换,需要运行时类型信息,通常用于多态类。例如:

class BaseClass {    public:    int m_iNum;    virtual void foo(){}; // 基类必须有虚函数};class DerivedClass: public BaseClass {    public:    char* m_szName[100];    void bar(){};};BaseClass* pb = new DerivedClass();DerivedClass* pd1 = static_cast
(pb); // 子类 → 父类,静态类型转换,正确但不推荐DerivedClass* pd2 = dynamic_cast
(pb); // 子类 → 父类,动态类型转换,安全BaseClass* pb2 = new BaseClass();DerivedClass* pd21 = static_cast
(pb2); // 父类 → 子类,静态类型转换,危险DerivedClass* pd22 = dynamic_cast
(pb2); // 父类 → 子类,动态类型转换,安全

4. reinterpret_cast

reinterpret_cast 仅重新解释类型,不执行二进制转换,通常用于指针和算术类型。例如:

int doSomething(){return 0;};typedef void (*FuncPtr)();FuncPtr funcPtrArray[10];funcPtrArray[0] = reinterpret_cast
(doSomething); // 不同函数指针类型之间进行转换

总结

  • 使用 const_cast 去掉 const 或 volatile 属性。
  • 对基本类型转换使用 static_cast。
  • 对多态类转换使用 dynamic_cast。
  • 对不同指针类型转换使用 reinterpret_cast。

转载地址:http://mlpuz.baihongyu.com/

你可能感兴趣的文章
nodejs 的 Buffer 详解
查看>>
nodejs 读取xlsx文件内容
查看>>
nodejs 运行CMD命令
查看>>
Nodejs+Express+Mysql实现简单用户管理增删改查
查看>>
nodejs+nginx获取真实ip
查看>>
nodejs-mime类型
查看>>
NodeJs——(11)控制权转移next
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
nodejs与javascript中的aes加密
查看>>
nodejs中Express 路由统一设置缓存的小技巧
查看>>
nodejs中express的使用
查看>>
Nodejs中的fs模块的使用
查看>>
NodeJS使用淘宝npm镜像站的各种姿势
查看>>
nodejs包管理工具对比:npm、Yarn、cnpm、npx
查看>>
NodeJs单元测试之 API性能测试
查看>>
nodejs图片转换字节保存
查看>>
nodejs在Liunx上的部署生产方式-PM2
查看>>
nodejs字符与字节之间的转换
查看>>
NodeJs学习笔记001--npm换源
查看>>