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. git commit -am "remark" 提交

    一.前言 假如你昨晚把本地文件a.html提交到远程库,今早发现还有补充的内容,于是添加了新的内容到a.html,并且还在本地还多添加了“几个文件”,那么怎么使用git来把这些文件一并提交到远程库呢? ...

  2. 跳转到页面的某个anchor

    var loc = document.location.toString().split('#')[0]; document.location = loc + '#' + anchor;

  3. Oracle RAC时间同步(NTP/CTSS)

    1.RAC 相关时间同步(time synchronization)Oracle Grid可用两种方式进行时间同步1)基于OS的NTP2)基于clusterware的CTSS(Cluster Time ...

  4. VCG(VisualCodeGrepper)安装使用教程

    一.说明 代码审计工具看来还是比较难做,一是开源的代码审计工具少,二是原本的一些开源审计工具很多都不更新甚至不能使用了. VCG支持审计C++.Java.C#.PHP和VB,但其“审计”基本相当于函数 ...

  5. TCP/IP报文 三次握手 四次挥手

    1.TCP报文格式  TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图:图1 TCP报文格式  上图中有几个字段需要重点介绍下:  (1)序号:Seq序 ...

  6. 通过AssemblyResolve事件打包合并exe和dll文件

    使用WPF开发的安装包,在创建快捷方式的时候,需要用到COM程序集Windows Script Host Object Model,引用COM程序集后,会在debug目录生成Interop.IWshR ...

  7. learning at command AT+CIMI

    AT command AT+CIMI [Purpose]        Learning how to get the International Mobile Subscriber Identity ...

  8. UVa 10795 - A Different Task 对称, 中间状态, 数位DP 难度: 3

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  9. react中用pace.js

    pace.js不支持npm, 所以只能直接下载下来,当作普通js引入 我在用的时候怎么都引不到组件里去用 后来终于找到方法了,直接上图了 1.先将pace文件下载来放在公共js目录下,pace.les ...

  10. CSS技巧-文字分散对齐的方法

    下面的代码可以在IE中实现文字分散对齐: <table width="300" align="center">    <tr>      ...