在c中隐式类型转换是指编译器帮助你转换类型
显示类型转换(强转)是指强制转换,格式是(目标类型)源类型变量。
e.g:
int i;
float a;
float a = (float) i;
以下罗列几种类型转换:
(1)任何基本类型变量之间都可以进行隐式转换
int a;
float b;
char c;
double d;
short e;
a = b = c = d = e;//编译通过
(2)任何类型的指针 -> void * 之间都可以进行隐式转换
void * p = &a;
p = &b;
(3)void * -> 任何其他类型的指针 之间都必须强制转换
int *pa = (int *)p;
float *pb = (float *)p;
(4)任何类型的非常指针 -> 同类型的常指针 都可以进行隐式转换
const int * cpa = pa;
const float * cpb = pb;
(5)任何类型的常指针 -> 同类型的非常指针 之间必须进行强制转换
pa = (int *)cpa;
pb = (float *) cpb;
(6)除了void *外,任何其他类型的指针之间都必须进行强转
pa = (int *)pb;
但在c++中,显示类型转换的推荐格式是目标类型(源类型变量);
e.g.
float a = float (i);
c++中更加推荐的是如下类型转换:
1、静态类型转换:
static_case <目标类型>(源目标类型)
应用一:隐式转换的逆转换:像上面的(3)是隐式转换(2)的逆转换,所以上面的(3)还可以用静态类型转换:
int *pa = static_case<int *> (p);
float *pb = static_case<float *> (p);
(5)是隐式转换(4)的逆转换,但是(5)不可以用静态转换,有特定的转换来针对类型(5)
应用二:自定义类型转换
2、常类型转换:(去常转换)
const_case<目标类型>(源目标类型)
作用:去除指针或引用上的const属性
应用:即上述静态转换不了的情况:
(5)可以写成:
pa = const_case<int *> (cpa);
pb = const_case<float *> (cpb);
3、动态类型转换:
dynamic_case<目标类型>(源目标类型)
应用:多态父子类指针或引用之间的转换(对于具有继承关系的指针或引用类型转换)
动态类型转换,改转换过程发生在程序运行期间。一般的适用情况:使用基类对象的指针或引用执行某个派生类的操作且该操作不是虚函数(多态性继承)。
该操作符用于运行时检查该转换是否类型安全,但只在多态类型时合法,即该类至少具有一个虚拟方法。dynamic_cast与static_cast具有相同的基本语法,dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。该类型转换如:
class C
{
//…C没有虚拟函数
};
class T{
//…
}
int main()
{
dynamic_cast<T*> (new C);//错误
}
此时如改为以下则是合法的:
class C
{
public:
virtual void m() {};// C现在是 多态
}
4、重解释类型转换(硬转)
reinterpert_case<目标类型>(源目标类型)
应用:
(1)任意类型的指针或引用之间的转换
pa = reinterpert_case<int *>(pb);
(2)任意类型的指针或整型之间的转换
pa = reinterpert_case<int *> (1000);