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

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

一、typeid

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

  1. int a;
  2.  
  3. if(typeid(a) == typeid(int))
  4.  
  5. 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. 海量数据和高并发下的 Redis 业务优化实践

    本文内容是我在 6 月 23 日参加的深圳 GIAC 技术大会上演讲的文字稿. 观众朋友们,我是来自掌阅的工程师钱文品,掘金小册<Redis 深度历险>的作者.今天我带来的是分享主题是:R ...

  2. python多线程学习(一)

    python多线程.多进程 初探 原先刚学Java的时候,多线程也学了几天,后来一直没用到.然后接触python的多线程的时候,貌似看到一句"python多线程很鸡肋",于是乎直接 ...

  3. 牛客 545C 出题人的数组 (贪心)

    出题人有两个数组A,B,请你把两个数组归并起来使得$cost=\sum i c_i$最小. 归并要求原数组的数的顺序在新数组中不改变. 贪心水题 对于一段序列$A_i,A_{i+1},...,A_r$ ...

  4. Map<k,v>接口

    https://docs.oracle.com/javase/8/docs/api/java/util/Map.html public interface Map<K,V> K—key,V ...

  5. [转载]for、foreach、iterator的用法及效率区别

    来源:https://www.jianshu.com/p/bbb220824c9a 1.在形式上 for的形式是 for(int i=0;i<arr.size();i++){...} forea ...

  6. springboot(二十二)-sharding-jdbc-读写分离

    前面我们使用sharding-jdbc配置了分库分表.sharding-jdbc还有个用法,就是实现读写分离. 什么时候需要或者可以使用读写分离? 当我们的项目所使用的数据库查询的访问量,访问频率,及 ...

  7. 02 前端之css

    ---恢复内容开始--- 1.css的几种引入方式: 1.行内样式 (行内式是在标记的style属性中设定的css样式.不推荐大规模使用) <p style="color: red&q ...

  8. 第十九篇 jQuery初步学习

    jQuery 初步学习   jQuery可以理解为是一种脚本,需要到网上下载,它是一个文件,后缀当然是js的文件,它里面封装了很多函数方法,我们直接调用即可,就比方说,我们用JS,写一个显示与隐藏,通 ...

  9. java常用的加密技术

    详见:https://blog.csdn.net/it_beecoder/article/details/71480770 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以 ...

  10. js带有遮罩的弹窗

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...