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

我们先来回忆以下,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++技能

9a9092da5823a34e889247f71c2748e2.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ggplot2中显示坐标轴_R可视化08|ggplot2图层标度图层(scale layer)图例篇

"pythonic生物人"的第106篇分享本文详细介绍ggplot2中图例标度(legends scales)&#xff0c;续前篇R可视化07|ggplot2图层-标度图层(scale layer)-颜色盘篇本文目录4、图例标度(legends scale)图例位置设置修改ggplot2的图例符号ggplot2的图例顺序|方向等花里胡哨设置…

C explicit 关键字详解

explicit关键字的作用explicit关键字在写程序时使用的次数较少,但是仔细观察会发现,在C 标准库中的相关类声明中explicit出现的频率是很高的,那么explicit关键字到底有什么作用呢?接下来我就为大家一一解答。explicit为清晰的;明确的之意.顾名思义,关键字explicit可以阻止隐式…

unsafe java_Java如何以及为什么使用Unsafe?

unsafe java总览 sun.misc.Unsafe至少在Java 1.4&#xff08;2004&#xff09;中就已经存在于Java中。 在Java 9中&#xff0c;不安全性将与许多其他供内部使用的类一起隐藏。 以提高JVM的可维护性。 尽管仍不确定究竟将取代Unsafe到底是什么&#xff0c;但我怀疑将取代Unsafe不…

python决策树算法_决策树算法及python实现

决策树算法是机器学习中的经典算法 1.决策树(decision tree) 决策树是一种树形结构&#xff0c;其中每个内部节点表示一个属性上的测试&#xff0c;每个分支代表一个测试输出&#xff0c;每个叶节点代表一种类别。 假设小明去看电影&#xff0c;影响看电影的外部因素有 时间 电…

mysql 远程服务器返回错误404_远程服务器返回异常: (404) 未找到

代码如下&#xff0c;res 赋不了值&#xff0c;为什么&#xff1f;private HttpWebResponse GetData(string url, string agent null, string prod_id null, string oauth_consumerKey "C16207CBF5444A5BB2499189D1E526D5", string oauth_consumerSecret "8…

长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?

经常在C语言的头文件中看到下面的代码&#xff1a;#ifdef __cplusplus extern "C" { #endif// all of your legacy C code here#ifdef __cplusplus } #endif这通常用于C 和C混合编程的时候&#xff0c;为了防止C 的编译器在编译C文件的时候出现错误&#xff1b;众所周…

python自动批量发邮件脚本_Python实现自动发送邮件功能

简单邮件传输协议(SMTP)是一种协议&#xff0c;用于在邮件服务器之间发送电子邮件和路由电子邮件。Python提供smtplib模块&#xff0c;该模块定义了一个SMTP客户端会话对象&#xff0c;可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。 SMTP通讯的基本流程可以概…

aem 渲染_AEM中的单元测试(大声思考)

aem 渲染如果要在AEM中进行单元测试&#xff0c;这不是任何建议&#xff0c;而是各种思想的总结和一些可供选择的选项。 一段时间之前&#xff0c;我已经为客户进行了一些研究&#xff0c;这篇文章在很大程度上受到了这项工作的影响&#xff0c;但是很多上下文相关的东西已经被…

C语言中#if,#if defined ,#ifdef,extern的用法描述

1、#if 和#ifdef当asd_eee表达式存在而且&#xff0c;值为ture的时候接续向下执行例如#define TARGET_LITTLE_ENDINA 1 #define TARGET_BIG_ENDINA 0 #ifdef TARGET_LITTLE_ENDINA call little endina function #else call big endina function #endif上面的今天写的代码&…

java 排序性能_Java8排序–性能陷阱

java 排序性能Java 8带来了lambda的所有优点&#xff0c;使我们能够使用声明式样式进行编程。 但这真的免费吗&#xff1f; 我们是否应该担心必须为新的编程功能付出的代价&#xff1f; 这是一个我们可能要担心的例子。 考虑对这个简单类的实例进行排序&#xff1a; private…

delphi报列表索引越界怎么处理_图解Elasticsearch索引机制,此篇带你领悟新世界...

前言随着Elastic的上市&#xff0c;ELK不仅在互联网大公司得到长足的发展&#xff0c;而且在各个中小公司都得到非常广泛的应用&#xff0c;甚至连"婚庆网站"都开始使用Elasticsearch了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。因…

为什么C语言函数不能返回数组,却可以返回结构体

C语言函数为什么不能返回数组&#xff1f;在C语言程序开发中&#xff0c;我们不可以编写下面这样的代码&#xff1a;char f(void[8]{ char ret;// ...fill... return ret; }int main(int argc, char ** argv) {char obj_a[10];obj_a f(); }不可以编写这样的代码这其实就是不能…

oracle迁移mysql_从自建Oracle迁移至RDS MySQL

#本示例以名称为dtstest的数据库账号为例介绍授权命令&#xff0c;需要对PDB和CDB同时授权#PDB授权示例&#xff1a;create user dtstest IDENTIFIED BY rdsdt_dtsacct;grant create session to dtstest;grant connect to dtstest;grant resource to dtstest;grant select on a…

2015年传智播客java_2015年Java 8强势开始

2015年传智播客javaJDK 8从2015年开始&#xff0c;其博客文章和文章的受欢迎程度将激增。 这与本月将 Java 自动升级到JDK 8恰好吻合。 在这篇文章中&#xff0c;我列出并简要描述了2015年已经发布的许多有关JDK 8的文章和帖子。 JDK 8 Streams在最近的帖子中理所当然地受欢迎…

python文件运行哪一个_如何使一个python文件运行另一个?

本问题已经有最佳答案&#xff0c;请猛点这里访问。 如何创建一个python文件来运行另一个&#xff1f; 例如&#xff0c;我有两个.py文件。我想运行一个文件&#xff0c;然后让它运行另一个.py文件。 docs.python.org / / modules.html教程 所以我execfile()模块通常是更好的。…

C语言printf()函数具体解释和安全隐患

程序员都知道&#xff0c;也都会使用printf函数&#xff0c;但你知道它也有“安全隐患”吗&#xff1f;下面就来举例我说说&#xff1a;嵌入式专栏1问题描述打印输出的数据并不是理论值&#xff0c;如下图&#xff08;右边&#xff09;&#xff1a;嵌入式专栏2进一步描述问题请…

brew search mysql_brew mysql

1、homebrew安装/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"2、命令使用安装软件&#xff1a;brew install 软件名&#xff0c;例&#xff1a;brew install wget搜索软件&#xff1a;brew search 软件名&a…

spring 请求转码_Spring请求级备忘录

spring 请求转码介绍 备注化是一种方法级别的缓存技术&#xff0c;用于加快连续调用的速度。 这篇文章将演示如何仅使用Spring AOP实现任何数据源的请求级可重复读取。 Spring缓存 Spring提供了非常有用的缓存抽象 &#xff0c;允许您将应用程序逻辑与缓存实现细节分离。 Sp…

java map 如何根据key获得对象_ThreadLocal:Java中的影分身

关于ThreadLocal&#xff0c;你有哪些疑问&#xff1f;ThreadLocal是用来解决什么问题的&#xff1f;如何使用ThreadLocal&#xff1f;ThreadLocal的实现原理是什么&#xff1f;可否举几个实际项目中使用ThreadLocal的案例&#xff1f;基础知识ThreadLocal是线程局部变量&#…

【C语言】你可能对 sizeof() 有点误解。。。

各位&#xff0c;今天还是按照惯例给大家分享一个C语言容易出现的小错误&#xff0c;这也是跟sizeof有关的&#xff0c;问题虽小&#xff0c;却可管中窥豹&#xff0c;话不多说&#xff0c;代码先行&#xff1a;#include int main() { int i; i 8; printf("%d\…