C++提供了四种新的类型强制:
static_cast
const_cast
reinterpret_cast
dynamic_cast
1)staic_cast静态强制;
不能在无关的指针之间进行static类型强制
class CAnimal
{
//...
public:
CAnimal(){}
};
class CGiraffe:public CAnimal
{
//...
public:
CGiraffe(){}
};
int main(void)
{
CAnimal an;
CGiraffe jean;
an = static_cast<CAnimal>(jean);//将对象jean强制成CAnimal类型
return 0;
}
2、const_cast类型强制
const_cast类型强制将一个const变量变成一个非const的等价形式
int main()
{
const int j = 99;
int * k;
k = const_cast<int *>(&j);//解除const
return 0;
}
3、reinterpret_cast运算符
reinterpret_cast运算符用来将一个类型指针转变为另一种类型的指针,也用在将整开型量转为指针,或将指针转为整型量上;
int main()
{
int j = 10;
int * ptr = &j;
char * cptr;
cptr = reinterpret_cast<char *>(ptr);//将int指针类型转变为char的指针类型
return 0;
}
4、dynamic_cast运算符
dynamic_cast的主要目的是:
1)它返回派生类对象的地址;
2)它测试基类指针是否指向下一尖括号<>中所指定类型的对象
dynamic_cast是一个运行时类型信息,dynamic_cast运算符将指向派生对象的基类部分的基类指针转变为指向派生对象的派生类指针,dynamic_cast必须严格地指定与派生对象相同的类,或者它返回NULL指针;
class CAnimal
{
//...
};
class CGiraffe:public CAnimal
{
//...
};
class CGoat:public CAnimal
{
//...
};
int main()
{
CGiraffe gene;
CAnimal * aptr = &gene;
CGiraffe * ptr1,* ptr2;
ptr1 = dynamic_cast<CGiraffe *>(aptr);
ptr2 = dynamic_cast<CGoat *>(aptr); //return NULL
return 0;
}
类型转换在。我们编写程序时是不可避免的,比如我们分配一个内存区域,它将要存储的对象类型对编译器是不可知的。最典型的例子就是void*指针,调用malloc时会返回一个void*,编译器并不知道void*指向的对象类型。
由此可见,类型转换时不可以或缺的!下面我们介绍C++提供的4种显示类型转换,及继承自C的类型转换方式(Type)expression。本文的主要内容如下:
* 写在前面
* static_cast(exp)显示转换
* reinterpret_cast(exp)显式转换
* dynamic_cast(exp)显示转换
* const_cast(exp)显示转换
* 总结
1、写在前面
显示类型转换有时是必需的,如前面提到的void *指针。我们必须将malloc返回的void*指针显示转换为特定的类型,eg.:int * p=static_cast<int*>(malloc(100));还有如果我们想通过一个给定的十六进制数访问内存。这大大方便了我们编程,但同时也带来了风险,用得不好将成为很多错误的根源!如你通过一个十六进数去访问内存可能会导致程序崩溃;如你内存转换时可能会截断原有数据……
因此我们在类型转换时必须得小心。
2、static_cast(exp)显示转换
static_cast类型转换用于相关类型之间的转换,诸如:在同一个类的继承层次关系中,向上或向下转换;枚举类型与整数类型之间的转换;浮点类型与指数类型之间的转换。
。。。
在这4中类型转换中,static_cast是最接近C-style的了。
3、reinterpret_cast(exp)显式转换
字面理解即re-interpret,重新解析(释)的意思。故名思意,它主要用于不相关类型之间的转换,好一个英文单词在不同的上下文中,词性和词义可能完全不同。它为不同类型之间转换带来的便利,但是也伴随着风险的,如将一个十六进制整数转换为内存地址(由int-->指针类型,这两种类型完全不关联)。既然是用于不相关类型之间的转换,也就意味着编译器不会做太多的确认和承诺。
reinterpret_cast方式还有一个特点就是:目标和原始值之间至少有相同的位数,我们可以将转换之后的值再转换回去,而不像其它3种类型可能会导致精度丢失
4、dynamic_cast(exp)显示转换
一种运行时(run-time)检测的类型转换,因此转换可能需要较大的运行时代价,这种类型也是用C-style是无法实现的。主要用于执行类型向下转换和继承之间的转换。
。。。。
5、const_cast(exp)显示转换
用于消除变量的const限定,转换之后的变量就不再具有“const”了,如果是一个const指针的话,转换之后可以改变指向而指向其它对象。
。。。。。
6、总结
用C-style的(Type)expression的格式转换,可以用我们上面介绍的4种方式来替代。虽然C++中可以使用C-style的形式仍可用,但更加建议使用上面的4中类型。因为C-style的类型转换更加危险:
* 在一个大型程序中更难定位和识别
* 哪种类型转换并不明显
而用上面的四种方式可以更加准确地定位哪种类型转换发生了错误。
分享到:
相关推荐
c++与pb的数据类型的转换关系,可解决pb中API编程涉及的数据类型转换问题
C++数据类型之间的转换,描述了c++中一些常见的数据类型之间的转换
c++ 数据类型转换 c++ 数据类型转换 c++ 数据类型转换 c++ 数据类型转换
C++和C#之间使用不同数据类型,当使用不同的语言实现时就需要转换数据类型
C++中的数据类型转换方法标准c++MFC类型,归纳汇总。
C#写的 C,C++语言的数据类型转换;C的时间戳转换工具
C++ 多种数据类型转换,包括C++语言的常用数据类型之间的转换
类的转换,C++的内部数据类型遵循隐式类型转换规则,成员转换函数
C++和C#的类型转换,全面地列出了C++和C#中对应的类型,因为在调用dll中经常地在两种语言之间转换数据类型。
描述在使用C语言进行编程时经常遇到的数据类型间的相互转换问题。
C++常用数据类型使用转换详解
java jni 与 c++ 数据类型转换 及调用
vc数据类型转换大全,包括各种类型行之间的转换!非常方便!
c/c++ Windows移植到LINUX 的数据类型转换总结,都在WinToLinux.h文件中,需要时直接引入此头文件即可,很实用。
C# 与 C++ 数据类型比较及结构体转换 C# 与 C++ 数据类型比较及结构体转换
30种c++中常用到的数据类型转换。已经封装成函数的形式,包含.h和.c,直接包含到工程中就能用
类型转换可以将一种数据类型转换为另一种数据类型,以便于不同的数据类型之间的交互和操作。本文将详细介绍C++中常见的类型转换,包括IP地址转换、CString类型转换、float、int、double类型转换、string类型转换等。...
C++数据类型之间的转换源代码,介绍了使用C转换函数族,snprintf/sscanf和stringstream的使用方法。
这篇笔记是根据StackOverflow上面的一个问题整理而成,主要内容是对C/C++当中四种类型转换操作进行举例说明。在之前其实对它们都是有所了解的,而随着自己在进行总结,并敲了一些测试示例代码进行验证之后,对它们的...
C++中不同数据类型之间相互转换总结,如string、CString、int、long、float、double等之间相互转换。