C++强制类型转换分为4个不同的类型。

  1、static_cast

    -用作基本类型转换

    -不能用于基本类型指针转换。

    -可以用于有继承关系对象之间的转换和类指针之间的转换。

    

#include <stdio.h>

void static_cast_demo(void)
{
int i = 0x12345;
char c = 'c';
int* pi = &i; //pi -> i
char* pc = &c; //pc -> c c = static_cast<char>(i);//int i change to char c
pc = static_cast<char*>(pi);//想通过 static_cast 将int 型指针转换为 char型指针。由于static_cast不能用于基本类型指针转换error
} int main(int argc, char *argv[])
{ return ;
}

编译结果:  

test.cpp: In function ‘void static_cast_demo()’:
test.cpp::: error: invalid static_cast from type ‘int*’ to type ‘char*’

  2、const_cast

    -用于去除变量的只读属性。

    -强制内心转换的目标只能是指针或者引用  

/*强制类型转换*/
#include <stdio.h> void const_cast_demo(void)
{
const int& j = ;//定义一个j引用常量,j拥有只读属性
int& k = const_cast<int&>(j);//定义一个k,通过const_cast k去除了j所拥有的只读属性 const int x = ; //定义一个常量x x拥有只读属性
int& y = const_cast<int&>(x);//定义一个y 通过const_cast y去除了引用x时所拥有的只读属性,所以y是可变的 int z = const_cast<int>(x);//想通过const_cast 来将x转换为一个int型变量,这不允许,因为const_cast 强制转换的目标只能是指针或者引用。error k = ; printf("k = %d\n", k);
printf("j = %d\n", j); y = ; printf("x = %d\n", x);
printf("y = %d\n", y);
printf("&x = %p\n", &x);
printf("&y = %p\n", &y); } int main(int argc, char *argv[])
{ const_cast_demo();
return ;
}

编译结果:  

test.cpp: In function ‘void const_cast_demo()’:
test.cpp::: error: invalid use of const_cast with type ‘int’, which is not a pointer, reference, nor a pointer-to-data-member type

  3、dynamic_cast

    -用于指针类型之间的强制类型转换。

    -用于整数和指针类型之间的强制类型转换。

#include <stdio.h>

void dynamic_cast_demo()
{
int i = ;
int* pi = &i;
char* pc = dynamic_cast<char*>(pi);//dynamic_cast 只能用于整数与指针类型之间的相互转换,这里将 整数类型转换为 char*类型 error
}
int main(int argc, char *argv[])
{ return ;
}

编译结果:  

test.cpp: In function ‘void dynamic_cast_demo()’:
test.cpp::: error: cannot dynamic_cast ‘pi’ (of type ‘int*’) to type ‘char*’ (target is not pointer or reference to class)

  4、reinterpret_cast

    -用于有继承关系类指针之间的转换。

    -用于有交叉关系类指针之间的转换。

    -具有类型检查功能

    -需要虚函数的支持。    

#include <stdio.h>

void reinterpret_cast_demo()
{
int i = ;
char c = 'c';
int* pi = &i;
char* pc = &c; pc = reinterpret_cast<char*>(pi);//将int* 类型指针 转换为 char*
pi = reinterpret_cast<int*>(pc);//将char* 类型指针 转换为 int*
pi = reinterpret_cast<int*>(i);//将int 类型转换为 int*类型指针
c = reinterpret_cast<char>(i); //想 通过reinterpret_cast 将int型 转换为char型 普通类型转换使用static_cast error
}
int main(int argc, char *argv[])
{ return ;
}

   编译结果:   

test.cpp: In function ‘void reinterpret_cast_demo()’:
test.cpp::: error: invalid cast from type ‘int’ to type ‘char’

  

用法格式:xxx_cast <type>(Expression)

  

C++新型强制类型转换。的更多相关文章

  1. C++ 强制类型转换详解

    类型转换只不过是让编译器以另外一种方式解释一块内存而已.C++兼容C语言的强制类型转换方式,同时也提供了新型的基于模板的类型转换方式,来提供更多的安全性. 一.C风格的强制类型转换 double k ...

  2. java中强制类型转换

    在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  3. C++强制类型转换

    C语言强制类型转换过于粗暴,任意类型之间都可以进行转换,编译很难判断其正确性; 难于定位,在源码中无法快速定位所有使用强制类型转换的语句. C++将强制类型转换分为4种不同的类型:static_cas ...

  4. java提高篇(十一)-----强制类型转换

    在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  5. JavaScript学习10 JS数据类型、强制类型转换和对象属性

    JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...

  6. C++强制类型转换操作符 dynamic_cast

    dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设 ...

  7. C++强制类型转换操作符 const_cast

    const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转 ...

  8. C++强制类型转换操作符 static_cast

    static_cast是一个强制类型转换操作符.强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast.dynamic_cast.const_cast.reinterpert ...

  9. Js里面的强制类型转换

    js 和 PHP语言一样是弱类型语言.近期我也在看C语言,并没有传说中那么难,既是书中一再强调的指针部分,也没有那么夸张.至少是理论和语法理解起来不是很难.看起来凡是什么东西,不要总是被别人的话迷惑了 ...

随机推荐

  1. APUE学习之进程控制 - fork 与 vfork

    最后编辑: 2019-11-6 版本: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 一.进程标识 每一个进程都有一个唯一的非 ...

  2. CentOS6.5卸载自带的Mysql软件

    现想要在这家的服务器上安装Mysql集群,发现之前安装操作系统的时候顺便把MySql默认安装,所以需要将它先卸载掉. 1,查找已安装的mysql版本 [root@leader ~]# rpm -qa| ...

  3. JavaWeb--Servlet 详解

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互.这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求后 ...

  4. gojs常用API

    操作类API: 添加节点: myDiagram.model.addNodeData(node); var node = {}; node["key"] = "节点Key& ...

  5. springboot学习问题一:启动springboot报错端口被占用解决办法

    一:问题 二:分析原因 springboot启动默认端口为8080,现在提示被占用,那我们可以修改springboot的启动端口,换一个未被占用的端口即可 三:解决方法 打开application.p ...

  6. 网络1911、1912 C语言第2次作业--循环结构 批改总结

    一.评分规则 伪代码务必是文字+代码描述,直接反应代码,每题扣1分 提交列表没内容,或者太简单,每题得分0分.注意选择提交列表长的题目介绍. 代码格式不规范,继续扣分. 代码互评,内容简单,0分. 原 ...

  7. 过滤器修改response

    过滤器通过doFilter方法的第二个参数ServletResponse将输出发送给客户,但servletResponse参数没有为过滤器提供servlet或jsp页面的访问:执行doFilter方法 ...

  8. js对数组分组处理

    一.js数组分组 1.js对数据分组类似group by 源码如下: <!DOCTYPE html> <html lang="en"> <head&g ...

  9. NOIP考前知识点整理

    前言:距离NOIP还有不到一百天(虽然NOIP没了),为了整理一下所学的内容,才有了这篇博文.本文内容无特殊说明全部来自于博主的博客,代码也都是新敲的,努力在个人的码风基础上做到尽量简洁,求资瓷. 一 ...

  10. DeepFaceLab620稳定版使用过程详解!

    网站上的小白入门系列教程是基于2019.3.13的版本而编写,有部分内容已经发生了变化.而目前比较稳定的版本为620,这个版本保持了很长一段时间,并没有发现什么大问题,用着挺好.所以我决定针对这个版本 ...