在C语言中,强制类型转换的方式为(Type)Expression,另外还有一种现在已经不用的旧式写法Type(Expression),这两种方式是等价的。

但是,C语言的强制类型转换方式存在一些问题:

  • 过于粗暴,可以在任意类型之间进行转换,编译器很难判断其正确性
  • 难于定位,在源代码中无法快速定位所有使用强制类型转换的语句

然而,强制类型转换在实际工程中几乎是不可避免的,为此C++将强制类型转换分为4种不同的类型,以提供更加安全可靠的转换。

强制类型转换 说 明
static_cast 用于基本类型之间、有继承关系的类对象之间、类指针之间的转换
不能用于基本类型指针之间的转换
const_cast 用于去除变量的只读属性
强制转换的目标类型必须是指针或引用
reinterpret_cast 用于指针类型之间、整数和指针类型之间的转换
dynamic_cast 用于有继承关系的类指针之间、有交叉关系的类指针之间的转换
具有类型检查的功能
需要虚函数的支持

C++提供的4种强制类型转换以关键字的方式出现,使用语法为:xxx_cast<Target Type>(Expression)

#include <stdio.h>

void static_cast_demo()
{
int i = 0x12345;
char c = 'c';
int *pi = &i;
char *pc = &c; c = static_cast<char>(i);
pc = static_cast<char *>(pi); // Error,static_cast不能用于基本类型指针间的转换
} void const_cast_demo()
{
const int &j = 1;
int &k = const_cast<int &>(j); const int x = 2;
int &y = const_cast<int &>(x); int z = const_cast<int>(x); // Error,const_cast的目标类型必须是指针或引用
} void reinterpret_cast_demo()
{
int i = 0;
char c = 'c';
int *pi = &i;
char *pc = &c; pc = reinterpret_cast<char *>(pi);
pi = reinterpret_cast<int *>(pc);
pi = reinterpret_cast<int *>(i);
c = reinterpret_cast<char>(i); // Error,reinterpret_cast不能用于基本类型间的转换
} void dynamic_cast_demo()
{
int i = 0;
int *pi = &i;
char *pc = dynamic_cast<char *>(pi); // Error,dynamic_cast只能用于有继承关系或交叉关系的类指针间的转换,且类中必须有虚函数
} int main()
{
static_cast_demo();
const_cast_demo();
reinterpret_cast_demo();
dynamic_cast_demo(); return 0;
}

可以看出,使用新的强制类型转换

  • 在编译时能够帮助检查潜在的问题
  • 搜索4个关键字,可以非常方便在代码中定位

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

  1. C#中的强制类型转换与as转换的区别

    C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA();  ClassB b = new ClassB(); 如果 ...

  2. 谈 JavaScript 中的强制类型转换 (2. 应用篇)

    这一部分内容是承接上一篇的, 建议先阅读谈 JavaScript 中的强制类型转换 (1. 基础篇) 前两章讨论了基本数据类型和基本包装类型的关系, 以及两个在类型转换中十分重要的方法: valueO ...

  3. JS在if中的强制类型转换

    JS在if中的强制类型转换 众所周知,JS在很多情况下会进行强制类型转换,其中,最常见两种是: 1.使用非严格相等进行比较,对==左边的值进行类型转换 2.在if判断时,括号内的值进行类型转换,转化为 ...

  4. 详细理解javascript中的强制类型转换

    将值从一种类型转换为另一种类型通常称为类型转换,这是显式的情况:隐式的情况称为强制类型转换,JavaScript 中的强制类型转换总是返回标量基本类型值,如字符串.数字和布尔值. 如何理解: 类型转换 ...

  5. 慕课网-安卓工程师初养成-2-10 Java中的强制类型转换

    来源:http://www.imooc.com/code/1241 相信小伙伴们也发现了,尽管自动类型转换是很方便的,但并不能满足所有的编程需要. 例如,当程序中需要将 double 型变量的值赋给一 ...

  6. ActionScript 3 中的强制类型转换

    以前AS中是这样进行强制类型转换的:假设有一个类叫做Class1,我们声明了一个它的对象 c1,如果想要将它转换成Class2类型,只要这样写: Class2(c1); 在AS3中你依然可以这样写,但 ...

  7. Java中的强制类型转换

    例如,当程序中需要将 double 型变量的值赋给一个 int 型变量,该如何实现呢? 显然,这种转换是不会自动进行的!因为 int 型的存储范围比 double 型的小.此时就需要通过强制类型转换来 ...

  8. Qt中的强制类型转换

    在C++开发中经常要进行数据类型的强制转换. 刚开始学习的时候,直接对基本数据类型强制类型转换,如float fnum = 3.14; int num = (int)fnum; 随着C++标准的发展, ...

  9. PHP中的强制类型转换

    学过静态语言开发的朋友对类型转换不会陌生,比如Java.C#.C++等.静态语言的好处就是变量强制必须指定类型,这也是编译的要求,所以大部分编译型的语言都会有强制变量类型的要求.而PHP据说也会在PH ...

随机推荐

  1. [Javascript] Check Promise is Promise

    const isPromise = obj => Boolean(obj) && typeof obj.then === 'function'; This can be a to ...

  2. wget递归下载网站资源

    wget -r -p -np -k http://archive.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/ 在下载https ...

  3. vue 项目的文件/文件夹上传下载

    前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践. ...

  4. chrome调试微信,app中H5网页的方法!

      调试微信,app中H5网页大概有如下几个方法: (1).我们可以直接把网页的url放在chrome浏览器中进行调试.(不涉及微信登录) (2).我们可以把网页的url放在微信开发者工具中进行调试. ...

  5. RSDS pdb格式

    本描述了“RSDS”或“DS”类型的pdb(程序数据库)文件的格式,这些文件是由Miscrosoft的link.exe从版本7及更高版本发出的. 什么是PDB文件? 如果选择了/DEBUG选项或/DE ...

  6. luoguP1576 最小花费

    LOL新英雄皮肤弹丸天使点击就送 两种做法: 1.边的权值为手续费z,从b向a跑最短路,边跑边处理答案 2.边的权值为汇率,从a向b跑最短路,边跑边处理答案 #include<cstdio> ...

  7. 「ZJOI2019」开关

    传送门 Description 有一些一开始全都是关的开关,每次随机选择一个(每个开关概率不同)开关并改变它的状态,问达到目标状态的期望步数 Solution  \(P=\sum_{i=1}^{n}p ...

  8. 解决MySql ERROR 1698 (28000) 错误:Access denied for user 'root'@'localhost'

    今天尝试在Ubuntu虚拟机上安装MySql 数据库(版本是:5.7.23-0Ubuntu0.18.04.1),数据库安装很简单,就是三行命令:   sudo apt-get install mysq ...

  9. 【解决方案】Chrome崩溃问题解决

    问题描述 出现异常之前做的操作就是,因为换工位的需要,所以关闭电脑,修改网络配置. 问题分析 Firefox和其他应用网络正常 Chrome设置.帮助等选项均打不开 分析,很可能是电脑重启后,Wind ...

  10. docker 进程管理

    详文:理解Docker容器的进程管理:https://yq.aliyun.com/articles/5545 在Docker中,每个Container都是Docker Daemon的子进程. dock ...