数据类型转换、类型判断
最近总想着写一些通用的代码,然集中收纳到自己的私人库中去,这些代码期望能与公司基础数据结构无关。然而这比较难,因为无论如何,必需要用到一些结构 化的东西,这些与基础引擎等有关,必需极度抽象才可以做到层层分离,于是我想将分两个层级,一级模版代码,只支持标准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风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,而考虑类型安全或者常量的情形。
不得已时才用!
希望尽快重新改掉熬夜的习惯,重拾夕日良好的精神面貌。