我们先来回忆以下,C 语言的强制类型转换形式:

 (type) expr;

这种旧式强制类型转换从表现形式上来说不够清晰明了,容易看漏,一旦转换过程出现问题,追踪起来也就更加困难。

为了解决以上问题,C++不仅兼容了C的强制转换,来引入了新的转换方法。

强制类型转换的形式:

cast-name<type>(exper);

其中,type是转换的目标类型,exper是要转换的值,cast-name 有以下四种:

  1. static_cast

  2. dynamic_cast

  3. const_cast

  4. reinterpret_cast

接下来,我们逐个进行分析。

1、static_cast

这里先介绍下顶层const和底层const的概念:

(1)顶层const,表示指针本身是常量,例如:

int *const p1 = &i;p1 = &j;       //编译报错,不能修改p1指向++(*p1);       //可以,可以修改p1所指向的值的内容

(2)底层const,表示指针所指的对象是一个常量,例如:

const int *p2 = &i;p2 = &j;       //可以,可以修改p2的指向++(*p2);       //编译报错,不能修改p2所指向的值的内容

那么再来说说static_cast:任何具有明确定义的类型转换,除了不包含底层const,都可以使用 static_cast。例如:

double d = 0.1;void* p = &d; double *dp = static_cast<double*>(p);

static_cast本质上是传统c语言强制转换的替代品。

通常,该操作符用于非多态类型的转换,任何标准转换都可以使用它。

2、dynamic_cast

用于将基类指针或引用安全的转换成派生类的指针或引用(运行时类型识别)。

dynamic_cast运算符的使用形式如下:

dynamic_cast(e)dynamic_cast(e)dynamic_cast(e)

其中,type必须是一个类类型,并且通常情况下该类型应该含有虚函数,在第一种形式中,e必须是有效指针;在第二种形式中,e必须是一个左值,在第三种形式中,e不能是左值。

如果转换目标是指针并且转换失败,则结果是0,如果转换目标是引用并且转换失败的,则会抛出异常。

因此,dynamic_cast操作符一次执行两个操作。首先验证被请求的转换是否有效,只有转换有效,操作符才实际进行转换。

3、const_cast

只能用于改变运算对象的底层const(去掉const属性)

例:

const char *p1;char* p2 = const_cast<char*>(p1);

注意,我们去掉了const属性,编译器不会再阻止我们对该对象进行写操作,但要注意,通过p2写值是未定义行为。

4、reinterpret_cast

该操作符用于将一种类型转换为另一种不同的类型,

比如可以把一个指针类型转换为一个整数,再把整数转换为指针类型,并且还是原来那个指针。

“通常为运算对象的位模式提供较低层次上的重新解释“,即是将变量以二进制形式被重新解释为新的类型,这个操作本质是依赖于机器的,也就是说,还需要考虑移植性。要想安全的使用reinterpret_cast,必须对涉及的类型和编译器实现转换的过程都非常了解。

reinterpret_casts 的最普通的用途,就是在函数指针类型之间进行转换。

简单总结

  1. 基本类型(非多态)的转换用static_cast。

  2. 多态类之间的类型转换用dynamic_cast。

  3. 去掉const属性用const_cast。

  4. 不同类型的指针类型转换用reinterpreter_cast。(慎用)

- EOF -

推荐阅读  点击标题可跳转

1、C++ 初始化的坑,你也遇到过吗?

2、NVIDIA 开源 C++ 标准库 Libcu++

3、TIOBE 9月编程语言排行榜发布,C++增速最快,C++20 的功劳?

看完本文有帮助?请分享给更多人

关注「CPP开发者」加星标,提升C/C++技能

点赞和在看就是最大的支持❤️

const char * 类型的实参与 char * 类型的形参不兼容_4 种 C++ 强制类型转换,你都清楚吗?...相关推荐

  1. “const char *“ 类型的实参与 “char *“ 类型的形参不兼容错误的解决方法

    "const char *" 类型的实参与 "char *" 类型的形参不兼容错误的解决方法 参考文章: (1)"const char *" ...

  2. 关于VS2022 C++报错 const char* 类型的实参与char *类型的形参不兼容解决办法

    关于VS2022 C++报错 const char* 类型的实参与char *类型的形参不兼容解决办法 问题来源 错误原因 解决方案 问题来源 在学习写C++代码时候,去练习课本上课后习题时候的问题, ...

  3. IntelliSense: const char * 类型的实参与 LPCWSTR 类型的形参不兼容

    1.  在Windows程序设计中遇到错误: (1)IntelliSense:  "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼 ...

  4. const char*类型的实参与LPCTSTR类型的形参不兼容 MFC

    "const char *" 类型的实参与 "LPCTSTR" 类型的形参不兼容 http://blog.sina.com.cn/s/blog_6ccd0a11 ...

  5. “const char *“ 类型的实参与 “LPCWSTR“ 类型的形参不兼容,VScode

    不同于VS系列,VScode我找到没有快速的解决办法,只能一点一点来 问题: wnd.lpszClassName = "WindowClass"; 不能将 "const ...

  6. “const wchar_t *“ 类型的实参与 “LPCSTR“ 类型的形参不兼容的原因和解决方法

    (133条消息) "const wchar_t *" 类型的实参与 "LPCSTR" 类型的形参不兼容的原因和解决方法_cmiao-me的博客-CSDN博客

  7. VSCode C/C++提示“LPCSTR 类型的实参与LPCWSTR类型的形参不兼容“

    VSCode C/C++提示"LPCSTR 类型的实参与LPCWSTR类型的形参不兼容" 问题产生原因 VSCode中的C/C++插件会对当前代码进行错误检测,并以波浪线或其它形式 ...

  8. int类型的实参与int*类型的形参不兼容_谁告诉的你们Python是强类型语言!站出来,保证不打你!...

    1. 真的能用隐式类型转换作为强弱类型的判断标准吗?最近有些学员问我,Python到底是强类型语言,还是弱类型语言.我就直接脱口而出:Python是弱类型语言.没想到有一些学员给我了一些文章,有中文的 ...

  9. IntelliSense: const char * 类型的实参与 LPCTSTR 类型的形参不兼容

    unicode字符问题.2010工程默认是宽字符版本 解决方法: 菜单 项目 -> 属性 (打开属性页) -> 配置属性 -> 常规 -> 字符集   单前选中的应该是&quo ...

最新文章

  1. JavaScript arguments对象
  2. 定制CentOS 6.3 自动安装盘
  3. 刷新SqlServer所有视图【存储过程】
  4. RabbitMQ系列教程之二:工作队列(Work Queues)
  5. POJ 3991 Seinfeld
  6. CTF-Bugku逆向题Android方法归纳
  7. 图论算法(三)--最短路径 的Bellman-Flod [ 带负权值图 ] 的解法(JAVA )
  8. HDU 1255 覆盖的面积(线段树+扫描线)
  9. java 编辑器 开发工具_好的程序员有哪些实用的HTML5开发工具可以选择?
  10. 十 suprocess模块
  11. Keil MDK5 破解
  12. 2.aop原理:@EnableAspectJAutoProxy
  13. uni-app 选择图片上传到服务器、云储存
  14. 查询三方jar包漏洞
  15. 2022蓝帽杯初赛部分wp
  16. 成功实现NAS家庭服务器(流媒体播放、文件共享及下载机)
  17. mysql字段中有问号_Mysql数据库,表中有中文时,select出来好多问号(?)的解决方法...
  18. Linux使用shell定时任务实现ffmpeg视频转码和截图
  19. 支持向量机(二)——松弛变量处理异常点
  20. Unity3D 之 学习路线与学习经验分享

热门文章

  1. java 字符串对齐_最佳字符串对齐的Java实现
  2. 自动化用户特定实体的访问控制
  3. hadoop emr_在Amazon EMR上运行Hadoop MapReduce作业
  4. 设计模式 建造者模式_设计模式:建造者
  5. specs.4.8.gz_使用Specs2和客户端API 2.0进行富有表现力的JAX-RS集成测试
  6. jee过滤器应用场景_将涡轮增压器添加到JEE Apps
  7. java高性能序列化_Java最佳实践–高性能序列化
  8. 使用Maven和WebLogic 12c开发Java EE应用程序
  9. JSF Tomcat配置示例
  10. 重新同步多线程集成测试