最近总想着写一些通用的代码,然集中收纳到自己的私人库中去,这些代码期望能与公司基础数据结构无关。然而这比较难,因为无论如何,必需要用到一些结构 化的东西,这些与基础引擎等有关,必需极度抽象才可以做到层层分离,于是我想将分两个层级,一级模版代码,只支持标准C++的东西,存入库中;二级代码,这些作为普通常函数,将会引擎一些引擎级别的数据,尽量通用;三级则是应用实例代码。

  如此一来必需有类型判断和通用的结构,以下收集一些数据类型处理的的方法。

一、typeid

  typeid 和 sizeof一样是个运算符,eg.

int a;

if(typeid(a) == typeid(int))

    cout<<"int";

  另外 typeid(int).name() 返回值 为string 或者char*,可据此检测类型。

二、类型转换

  1、隐式转换,当数据参与运算时,不同类型将被自动转换

                                数据类型排名

long double
double
float
unsigned long long int
long long int
unsigned long int
long int
unsigned int
int

    char、short 和 unsigned short 值自动升级为 int 值;

    当运算符使用不同数据类型的两个值时,较低排名的值将被升级为较高排名值的类型;

    当表达式的最终值分配给变量时,它将被转换为该变量的数据类型。

  2、C风格的强转换和C++风格的强转换

      double booksPerMonth = (double)books / months;//C风格

      double booksPerMonth = double(books) / months;//C++风格,这种类型转换表示法被称为功能性表示法

  3、特殊的类型转换

    1)static_cast<DataType>(Value)

      功能:完成编译器认可的隐式类型转换,如基础类型和派生系向上转换,但不支持指针与常见的int、float等类型转换。

      一种用法是用来防止发生整除法,即除得的结果被舍入得到整数。另外在涉及输出时也可能需要用到强制转换来规避隐式转换带来的弊端。

      double booksPerMonth = static_cast<double>(books) / months;    

    2)dynamic_cast<DataType>(Value)

  功能:执行派生类指针或引用与基类指针或引用之间的转换。

特征:

      1、其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行运行时类型检查;

      2、不能用于内置的基本数据类型的强制转换;

dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

      3、使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过;

  需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念)中,只有定义了虚函数的类才有虚函数表。

4、在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比 static_cast更安全。

  向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。可以实现向上转型和向下转型,前提是必须使用public或protected继承

3)const_cast<DataType>(Value)

  功能:只能对指针或者引用去除或者添加const属性,对于变量直接类型不能使用const_cast;不能用于不同类型之间的转换,只能改变同种类型的const属性。

  const int a= 0;   int b = const_cast<int>(a);//错

const int *pi = &a;  int * pii = const_cast<int *>pi;//去除指针中的常量性,也可以添加指针的常量性;

特征:const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。

4)reinterpret_cast<DataType>(Value)

功能:

  即重新解释,此标识符重新解释数据的二进制形式,但是不改变其值。有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,而考虑类型安全或者常量的情形。

不得已时才用!

    

    希望尽快重新改掉熬夜的习惯,重拾夕日良好的精神面貌。

C/C++数据类型判断与转换的更多相关文章

  1. java中的、标识符、运算符以及数据类型之间的转换。

    ---恢复内容开始--- 数据类型之间的转换: 1:自动转换:就是不用说出要转换成什么类型,由java中的虚拟机自动将小数据类型转换成大数据类型,但大数据中的数据精度有可能被破坏. 2:强制转换:强制 ...

  2. JavaScript复习之--javascript数据类型隐式转换

    JavaScript数据类型隐式转换.一,函数类    isNaN()    该函数会对参数进行隐式的Number()转换,如果转换不成功则返回true.    alert()    输出的内容隐式的 ...

  3. JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较

    JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时 ...

  4. 系统学习(javascript)_基础(数据类型之间的转换)

    在js中数据类型转换一般分为两种,即强制类型转换和隐式类型转换(利用javascript弱变量类型转换). 强制转换: 利用js提供的函数parseInt(),parseFloat(),Number( ...

  5. 10-10C#基础---数据类型之间的转换

    10-10  C#基础数据类型转换(熟练掌握) 第一课 数据类型之间的转换 基本类型的转换:自动转换(隐式转换)和强制转换(显示转换) 装箱转换:允许值类型隐式转换成引用类型. 拆箱转换:允许将引用类 ...

  6. javascript数据类型判断

    javascript基本数据类型:原始类型  和  引用类型 原始类型(简单数据类型):String,Number,Boolean,Undefined,Null,Symbol(ES6新增) 引用类型( ...

  7. js数据类型判断和数组判断

    这么基础的东西实在不应该再记录了,不过嘛,温故知新~就先从数据类型开始吧 js六大数据类型:number.string.object.Boolean.null.undefined string: 由单 ...

  8. Java基础——数据类型之间的转换

    Java数据类型分为三大类,即布尔型.字符型和数值型.其中数值型又分为整型和浮点型.Java的基本数据类型(8种)为布尔型boolean(1字节):字符型char(2字节):整型byte(1字节).s ...

  9. C#中数据类型的安全转换(is,as)

    原文 C#中数据类型的安全转换(is,as) 下面代码中,不能装箱,在强制类型转换时出错,因为之前 c 是 class 类型,而却要把它转换为 int 类型,这是不可以的.虽然编译器能通过编译,但是 ...

随机推荐

  1. DIN

    1. DIN(Deep Interest Network)优点 使用用户兴趣分布来表示用户多种多样的兴趣爱好. 使用Attention机制来实现Local Activation,局部激活相关的历史兴趣 ...

  2. 好用的 Chrome 插件

    这些好用的 Chrome 插件,提升你的工作效率   本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可 ...

  3. alembic常用命令和经典错误解决办法

  4. POP与OOP编程模式对比

    面向过程:(procedure oriented programming 即:POP) 代表:C/C++ 向过程程序设计,它是以功能为中心来进行思考和组织的一种编程方式,强调的是系统的数据被加工和处理 ...

  5. springboot 打包问题 项目依赖三方jar ,之前的同事是直接丢到项目lib下 ,今天使用springbioot打包的时候,找不到这个jar

    试了很多种方法 最后还是老老实实按照maven 那种格式把三方jar(或者很难下载下来的那种jar) 打包成仓库哪种格式 mvn install:install-file -Dfile=C:\User ...

  6. selenium爬虫后上传数据库。

    一.准备工作 1.1安装软件 安装python.安装谷歌浏览器.将chromedriver.exe放到指定位置.放到Scripts文件夹中.我这边的路径为:C:\Users\1\AppData\Loc ...

  7. iframe高度/宽度自适应(使用body而不是docuemntElement对象)

    iframe在ie11中会显示过于短.为了自适应,增加如下代码: <iframe *** onload='changeFrameHeight()' > <script> fun ...

  8. 【B2B】01-BFS

    纠正我对 01-BFS 问题的错误认识. 我一直以为对于 01-BFS,每次点 $u$ 出队时,对于 $u$ 的邻接边表中的边,只要先松弛边权为 0 的边再松弛边权为 1 的边就能保证每个点只入队一次 ...

  9. Windows系统下同时安装Python2和Python3

    Windows系统下同时安装Python2和Python3 说明 有时由于工作需求我们需要在Python2版本下面进行一些开发,有时又需要Python3以上的版本,那么我们怎么在一台电脑上同时安装多个 ...

  10. python_0基础开始_day06

    第六节 1.小数据池 ==,is,id ==:查看等号两边的值是否一样 a = 9b = 9print(a == b) # 返回Truec = "dog"d = "dog ...