C++提供了四个显式的数据类型转换函数(转载自天新网)
2013-05-08 10:46
113 查看
C++提供了四个显式的数据类型转换函数
http://www.21tx.com 2008年12月30日
1 reintERPret_cast(在编译期间实现转换)
reinterpret_cast类型转换函数将一个类型的指针转换成另一个类型的指针。这种转换不用于修改指针变量值数据存放的格式(不改变指针变量值),只需在编译期间重新解释指针的类型就可以做到。
reinterpret_cast可以将指针值转换为一个整型数。但是不能用于非指针类型的转换,否则将不会通过编译。
什么时候使用reinterpret_cast进行数据类型的转换:
(1)将基本类型指针转换成另一个类型的指针。
例如:
基本类型指针的转换
(2)将一个类的指针转换为另一个类的指针。
类指针类型的转换:
(3)不能转换非指针类型
例如:
将int类型转换为float类型时是不能够转换成功的
int i = 8;
double dl = reinterpret_cast<double>(i);
(4)不能将一个const指针转换成void*类型的指针
const int* pci = 0;
void *pv = reinterpret_cast<void*>(pci);
2 const_cast(在编译期间实现转换)
const_cast用于去除指针变量的常量属性,将它转换为一个对应指针类型的普通变量,反过来,也可以将一个非常量的指针变量转换为常量指针变量。这种转换是在编译期间作出的类型更改。
(1)将常量指针变量转换为对应指针类型的普通变量
const int *pci = 0;
int* pj = const_cast<int*>(pci);//相当于隐式转换int* pj = (int*)pci;
(2)将普通指针变量转换为一个常指针变量
int* pi =0;
const int* pcj = const_cast<const int*>(pi);//相当于隐式转换const int* = (int*)pi
(3)将类的常指针变量转换为类的普通指针变量
const A* pca = new A;
A* pa = const_cast<A*>(pca);//相当于隐式转换A* pa = (A*)pca;
(4)无法将非指针的常变量转换为普通变量,无法将非指针的普通变量转换为常变量。
int i =0;
const int cj = const_cast<const int>(i);//非指针转换,不能通过编译
(5)但可以通过隐式转换将非指针的普通变量转换为常变量。
int i = 0;
const int ck = (const int)(i);
3 stactic_cast(在编译期间实现转换)
stactic_cast主要用于基本类型之间和具有继承关系的类型之间的转换,这种转换一般会改变变量的内部表示方式,因此static_cast用于指针的转换没有太大的意义。即使允许指针类型的转换,也不及reinterprret转换的效率高。
(1)基本类型之间的转换
int i =0 ;
double d = static_cast<double int>();
(2)继承类型转换为基类
(3)继承类与基类指针进行转换编译能通过,但是基类转换为继承类指针具有一定的危害性
Dereived* pd = new Derived ;
Base *PB = static_cast<Base*>(pd);
(4)不能使用static_cast转换基本类型的指针
int* pi = 0;
double* pd = static_cast<double>(pi);
(5)不能把基类转换为继承类或转换无继承关系的类的指针
4 dynamic_cast(在运行期间实现转换,并可以返回转换成功与否的标志)
http://www.21tx.com 2008年12月30日
1 reintERPret_cast(在编译期间实现转换)
reinterpret_cast类型转换函数将一个类型的指针转换成另一个类型的指针。这种转换不用于修改指针变量值数据存放的格式(不改变指针变量值),只需在编译期间重新解释指针的类型就可以做到。
reinterpret_cast可以将指针值转换为一个整型数。但是不能用于非指针类型的转换,否则将不会通过编译。
什么时候使用reinterpret_cast进行数据类型的转换:
(1)将基本类型指针转换成另一个类型的指针。
例如:
基本类型指针的转换
double d = 9.3; double *pd = &d; int *pi = reinterpret_cast<int *>(pd);//相当于隐式转换int * pi = (int *)pd;
(2)将一个类的指针转换为另一个类的指针。
类指针类型的转换:
class A{}; class B{}; A* pa = new A; B* = reinterpret_ cast<B*>pa;
(3)不能转换非指针类型
例如:
将int类型转换为float类型时是不能够转换成功的
int i = 8;
double dl = reinterpret_cast<double>(i);
(4)不能将一个const指针转换成void*类型的指针
const int* pci = 0;
void *pv = reinterpret_cast<void*>(pci);
2 const_cast(在编译期间实现转换)
const_cast用于去除指针变量的常量属性,将它转换为一个对应指针类型的普通变量,反过来,也可以将一个非常量的指针变量转换为常量指针变量。这种转换是在编译期间作出的类型更改。
(1)将常量指针变量转换为对应指针类型的普通变量
const int *pci = 0;
int* pj = const_cast<int*>(pci);//相当于隐式转换int* pj = (int*)pci;
(2)将普通指针变量转换为一个常指针变量
int* pi =0;
const int* pcj = const_cast<const int*>(pi);//相当于隐式转换const int* = (int*)pi
(3)将类的常指针变量转换为类的普通指针变量
const A* pca = new A;
A* pa = const_cast<A*>(pca);//相当于隐式转换A* pa = (A*)pca;
(4)无法将非指针的常变量转换为普通变量,无法将非指针的普通变量转换为常变量。
int i =0;
const int cj = const_cast<const int>(i);//非指针转换,不能通过编译
(5)但可以通过隐式转换将非指针的普通变量转换为常变量。
int i = 0;
const int ck = (const int)(i);
3 stactic_cast(在编译期间实现转换)
stactic_cast主要用于基本类型之间和具有继承关系的类型之间的转换,这种转换一般会改变变量的内部表示方式,因此static_cast用于指针的转换没有太大的意义。即使允许指针类型的转换,也不及reinterprret转换的效率高。
(1)基本类型之间的转换
int i =0 ;
double d = static_cast<double int>();
(2)继承类型转换为基类
class Base{}; class Derived :public Base{}; Derived d; Base b = static_cast<Base>(d);
(3)继承类与基类指针进行转换编译能通过,但是基类转换为继承类指针具有一定的危害性
Dereived* pd = new Derived ;
Base *PB = static_cast<Base*>(pd);
(4)不能使用static_cast转换基本类型的指针
int* pi = 0;
double* pd = static_cast<double>(pi);
(5)不能把基类转换为继承类或转换无继承关系的类的指针
4 dynamic_cast(在运行期间实现转换,并可以返回转换成功与否的标志)
相关文章推荐
- C++提供了四个显式的数据类型转换函数
- C++四个显式数据类型转换函数
- 四个显式的数据类型转换函数
- VC数据类型转换函数总结(转载)
- (转载)C++的四个类型转换运算符
- 转载 C# 与 C++ 数据类型对照
- C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,
- c++primer第二章“c++定义了几种基本类型,还提供了可用于自定义数据类型的机制,此外,我们还能修改已有的类型以形成复合类型”
- C++ reinterpret_cast,const_cast等 显式类型转换总结(转载)
- <转载>C++各数据类型最大最小值
- (转载)你好,C++(9)坐216路公交车去买3.5元一斤的西红柿——C++中如何表达各种数值数据 3.3 数值数据类型
- (转载)你好,C++(10)这次的C++考试你过了没有?C++中表示逻辑判断的布尔数据类型
- [转载]c++:各种数据类型表示的范围
- 【转载】C++ ,C#数据类型对照
- C++第四周中提供了多种基本的数据类型(任务四)定义一个工资类
- C/C++基本数据类型(转载)
- (转载)你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
- C/C++数据类型转换函数
- (转载)你好,C++(12)如何管理多个类型相同性质相同的数据?3.6 数组
- C/C++基本数据类型 (转载)