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++ 和 C# 是两种非常流行的编程语言,它们之间的数据类型转换是非常必要的。本文将详细介绍 C++ 到 C# 数据类型的转换,包括基本数据类型、结构体、字符串、指针等。 一、基本数据类型转换 在 C++ 中,有很多基本...
### C++与PB的数据类型转换关系 在C++与PB(PowerBuilder)之间进行数据交换时,正确地处理数据类型转换至关重要。本文将详细介绍这两种语言之间的数据类型转换规则及其应用场景,帮助开发人员更好地理解并应用这些...
### C++中的四种类型转换详解 #### 一、引言 C++作为一种强大的面向对象编程语言,支持多种类型的转换机制,这些转换机制不仅能够帮助程序员处理数据类型之间的兼容性问题,还能确保程序的安全性和正确性。本文将...
总的来说,C++的数据类型转换是一门深奥的学问,熟练掌握各种转换方法是成为一名合格的C++程序员的关键。在编写程序时,应始终注意类型安全,避免不必要的类型转换,特别是那些可能导致数据丢失或错误的转换。通过...
本项目"TypeByte@2019_C#_C++_C数据类型转换时间戳转换_"显然是针对C#、C++和C这三种编程语言,提供了一种解决方案来实现数据类型的互转以及时间戳的转换。 首先,让我们深入探讨一下C#中的数据类型转换。C#是一门...
在C++编程语言中,为了实现不同数据类型之间的转换,提供了四种不同的强制类型转换操作符:`static_cast`、`const_cast`、`dynamic_cast` 和 `reinterpret_cast`。这些操作符不仅在日常开发中十分常见,而且在处理...
在实际开发中,我们经常需要在C++和C#之间进行数据类型转换,以便于在不同的语言环境中进行数据交换。 在C++和C#中,数据类型是不同的,C++使用C语言的数据类型,而C#使用.NET Framework的数据类型。因此,在将C++...
C++中的数据类型转换方法标准c++MFC类型,归纳汇总。
在C++编程语言中,类型转换是至关重要的概念,它允许程序员在不同数据类型之间进行操作。本资源“vc.zip”包含了一份关于C++类型转换的详细文档“vc.doc”,涵盖了从基本数据类型到复杂类型的转换方法。下面,我们将...
在C++编程语言中,类的转换是一种重要的特性,它允许程序员定义类对象与内置数据类型之间以及不同自定义类之间的转换方式。这种转换通常分为两种类型:转换构造函数和成员转换函数,这两种方法都遵循C++的隐式类型...
在C++编程中,数据类型转换是至关重要的概念,它允许程序员在不同数据类型之间进行灵活的操作。C++提供了多种方式来实现数据类型的转换,这使得我们能够在必要时改变变量的存储格式或处理精度。本篇文章将深入探讨...
C++ 数据类型转换 C++ 编程语言中,数据类型转换是非常重要的一方面。不同的数据类型之间可以相互转换,以满足不同的编程需求。在本文中,我们将详细介绍 C++ 数据类型之间的相互转换,包括基本数据类型、CString、...
C++ 数据类型转换 C++ 数据类型转换是指在不同的数据类型之间进行转换,以满足不同的应用场景和需求。在 C++ 中,数据类型转换可以分为两大类:隐式转换和显式转换。隐式转换是由编译器自动完成的,而显式转换则...
C++常用数据类型使用转换详解
在实际应用中,强制类型转换函数可以用于解决许多问题,例如将基本数据类型转换为其他类型、将基类指针转换为子类指针、将void指针转换为目标类型的指针等。但是,需要注意的是,强制类型转换函数可能会带来一些风险...
c/c++ Windows移植到LINUX 的数据类型转换总结,都在WinToLinux.h文件中,需要时直接引入此头文件即可,很实用。
在进行C#与C++之间的数据类型转换时,通常需要考虑以下几种情况: 1. **基本数据类型**:例如整型、浮点型等。 2. **指针与引用**:在C++中广泛使用的指针类型,在C#中主要通过引用(`ref`)或原生指针(`IntPtr`)...
下面我们将详细探讨C++中的数据类型转换及其应用。 1. **隐式转换(Implicit Conversion)**:这是编译器自动进行的转换,例如,将较小的类型(如`int`)赋值给较大的类型(如`long`)时,或者在运算中不同类型的...