C++四种类型转换方式

https://blog.csdn.net/lv_amelia/article/details/79483579

C风格的强制类型转换(Type Case)很简单,不管什么类型的传统转换都是:Type b = (Type)a,但是C风格的类型转换有不少的缺点,有的时候用C风格的转换是不合适的,因为它可以在任意类型之间进行转换,比如你可以把一个指向const类型的指针转换成指向非const类型的指针,把一个指向基类对象的指针指向派生类对象的指针,这两者之间的转换差距是巨大的,但是传统的C风格的转换没有区分这些。还有一个缺陷,C风格的转换不容易查找,它有一个括号和一个标识符组成,而这样的东西在C++程序中一大堆。所以C++为了克服这些缺陷,引进了四种类型转换操作符。

1、static_cast

功能:完成编译器认可的隐式类型转换

格式: 
  type1 a; 
  type2 b = static_cast(a); //将type1类型转换成type2类型

使用范围: 
(1) 基本数据类型之间的转换,如int->double 
  int a = 6; 
  folat b = static_cast(a);

(2) 基类和派生类之间的转换,但只能用于类的指针或者引用之间的转换 
  class base{}; 
  class derived:public base{}; 
  base *b; 
  derived *d = new derived(); 
  b = static_cast<base *>(d)

2、dynamic_cast 
功能:基类和派生类之间的转换,但只能用于类的指针或者引用之间的转换

格式: 
(1) 其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时需要进行类型检查; 
(2) 基类中要有虚函数,因为类型检查的类型信息在虚函数表中,有虚函数才会有虚函数表; 
(3) 可以实现向上转型和向下转型,前提必须使用public或protected继承; 
例子: 
  class base 
  { 
    virtual void fun(); 
  } 
  class derived:public base 
  { 
    void fun(); 
  } 
  
  base *b; 
  derived *d = new derived(); 
  b = static_cast<base *>(d)

3、const_cast 
功能:只能对指针或引用去除或者添加const属性,只能改变同种类型的const属性

常用用法: 
(1) 常用于函数的形参是一个非const的引用,我想要传进去一个const的引用,可以使用const_cast去除参数的常亮性,以便函数能够接受这个参数; 
(2) 一个const对象,我们想要调用该对象中的非const函数,可以使用const_cast去除对象的常亮性;

4、reinterpret_cast 
从字面意思就是“重新解释的类型转换”。也就是说任意两个类型之间都可以使用使用reinterpret_cast进行类型转换。

https://blog.csdn.net/u010154685/article/details/51800235

reinterpret_cast的功能比static_cast的功能更为强大,但安全性也更为的差,可以用它完成C++语法上不允许的\ 
转换,在某些情况下程序员有需要的转换。例如,可以把某种引用或指针类型转换为其他引用类型或指针类型(两\ 
个类型可以不相关),这个关键字还经常将指针转换为void*,以及将void*转换为指针。

下面通过代码说明reinterpret_cast的使用:

#include <iostream>

using namespace std;

//测试int 和 void*的相互转化
void test_voidpointer(void *data){
int d = reinterpret_cast<int>(data); cout << d << endl;
} //定义连个无关类A, B
class A{ }; class B{ }; int _tmain(int argc, _TCHAR* argv[])
{
//void* 和in的相互转化,这里应该注意一下64位平台和32位平台指针的大小不同
test_voidpointer(reinterpret_cast<void *>(20)); //A a;
B b; //a = reinterpret_cast<A>(b); //编译通不过,b不知指针或者引用 //下面是指针或引用的转化
A *pa = reinterpret_cast<A*>(&b);
A &ra = reinterpret_cast<A&>(b); system("pause");
return 0;
}

【转】C++四种类型转换方式的更多相关文章

  1. c++ --> c++中四种类型转换方式

    c++中四种类型转换方式   c风格转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少缺点, 1)它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向 ...

  2. 【C++】类型转换简述:四种类型转换方式的说明及应用

    本文主要简述在C++中四种类型转换的方式:static_cast.reniterpret_cast.const_cast和dynamic_cast. 在介绍C++类型转换方式之前,我们先来看看C语言的 ...

  3. C++四种类型转换方式。

    类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...

  4. C++中四种类型转换方式

    类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...

  5. C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)

    Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而 ...

  6. C++语言中的四种类型转换

    1 引子 这篇笔记是根据StackOverflow上面的一个问题整理而成,主要内容是对C/C++当中四种类型转换操作进行举例说明.在之前其实对它们都是有所了解的,而随着自己在进行总结,并敲了一些测试示 ...

  7. 从零开始学C++之从C到C++(二):引用、内联函数inline、四种类型转换运算符

    一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型  &引用名 = 变量名: 例如:int a=1; int  &b=a;// b是a的别名,因此a和b是同一个单元 注 ...

  8. C++中的4种类型转换方式

    类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...

  9. 引用、数组引用与指针引用、内联函数inline、四种类型转换运算符

    一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型  &引用名 = 变量名: 例如:int a=1;  int  &b=a;// b是a的别名,因此a和b是同一个单元 ...

随机推荐

  1. 2018"百度之星"程序设计大赛 - 资格赛 A/B/E/F

    调查问卷  Accepts: 505  Submissions: 2436  Time Limit: 6500/6000 MS (Java/Others)  Memory Limit: 262144/ ...

  2. LeetCode 958. 二叉树的完全性检验

    958. 二叉树的完全性检验  显示英文描述 我的提交返回竞赛   用户通过次数119 用户尝试次数157 通过次数123 提交次数378 题目难度Medium 给定一个二叉树,确定它是否是一个完全二 ...

  3. IntelliJ IDEA2017创建web工程并实现远程部署tomca【转载】

    [IntelliJ IDEA2017创建web工程并实现远程部署tomcat] 作者:https://segmentfault.com/a/1190000012762629 将应用打成war包方式 步 ...

  4. 如何定位jdk中的native方法源码?

    前提条件:已下载openjdk的源码. 以System类的arraycopy为例: 1. 根据关键字定位文件:grep -rn '"arraycopy"' ./openjdk关键字 ...

  5. 安天透过北美DDoS事件解读IoT设备安全——Mirai的主要感染对象是linux物联网设备,包括:路由器、网络摄像头、DVR设备,入侵主要通过telnet端口进行流行密码档暴力破解,或默认密码登陆,下载DDoS功能的bot,运行控制物联网设备

    安天透过北美DDoS事件解读IoT设备安全 安天安全研究与应急处理中心(安天CERT)在北京时间10月22日下午启动高等级分析流程,针对美国东海岸DNS服务商Dyn遭遇DDoS攻击事件进行了跟进分析. ...

  6. daal utils printNumericTable

    #=============================================================================== # Copyright 2014-20 ...

  7. nyoj 0269 VF(dp)

    nyoj 0269 VF 意思大致为从1-10^9数中找到位数和为s的个数 分析:利用动态规划思想,一位一位的考虑,和s的范围为1-81 状态定义:dp[i][j] = 当前所有i位数的和为j的个数 ...

  8. ROM和RAM区别

    在计算机的组成结构中,有一个很重要的部分,就是存储器.存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作.存储器的种类很多,按其用途分为主存储器和辅助存储器, ...

  9. Mybatis的二级缓存注意点

    --声明:一下内容都不一定是正确的,只是自己测试的结果,请自己的动手操作得出自己的结论 1.开启Mybatis的二级缓存,不仅要在SqlMapConfig.xml中进行开启总开关,还要在对应的XXXM ...

  10. caffe中全卷积层和全连接层训练参数如何确定

    今天来仔细讲一下卷基层和全连接层训练参数个数如何确定的问题.我们以Mnist为例,首先贴出网络配置文件: name: "LeNet" layer { name: "mni ...