c++的类型转换
来源:互联网 发布:centos 6.5安装telnet 编辑:程序博客网 时间:2024/06/03 21:31
1.c++的四种类型转换
static_cast, dynamic_cast, reinterpret_cast, const_cast
语法格式:
static_cast<type>(expr);
static_cast<void*>(expr);
2.类型转换的运用
(1).类的上下行转换和交叉转换
上行转换: 派生类指针转换到基类指针。
下行转换: 基类指针转换到派生类指针。
reinterpret_cast 可以用于上行转换也可以用于交叉转换,并且没有任何限制条件,但是安全性由程序员保证。
static_cast 可以用于上下行转换,但是在下行转换的时候不进行类型检查,所以转换是不安全的,转换安全行要由程序员保证。
dynamic_cast可以用于上下行转换,在下行转换的时候在编译期间就会进行类型检查,如果类型检查失败编译就不能通过。dynamic_cast的类型检查是利用虚函数表里面的类型信息,所以如果基类没有虚函数的话,那就没有虚函数表,那编译就不能通过。
ex:
class B{ };
class D:public B{};
int main()
{
B *pB = new B;
D *p = dynamic_cast<D*>(pB);//error C2683: 'dynamic_cast' : 'B' is not a polymorphic type
D *pS = static_cast<D*>(pB);//这里不会报错,只是不能保证类型安全。
}
改正的方法只需要在基类和子类有虚函数表就可以了:
class B{ public: virturl ~B(){} };
交叉转换:所谓交叉转换就是一个基类有不同的子类,转换在这个基类的不同子类的对象指针之间进行。
static_cast 不能用于交叉转换,编译器会报错。
dynamic_cast 能用于交叉转换, 所依赖的仍然是虚函数表里面的信息。
ex:
class B{public: virtual ~B(){} };
class D1:public B{};
class D2:public B{};
int main()
{
B *pB = new B;
D1 *pD1 = dynamic_cast<D1*>(new D2);
}
dynamic_cast转换的结果为NULL的时候:
dynamic_cast 转换依赖的是虚函数表里面的信息,但是在转换的时候,如果类型不能匹配的话,那么dynamic_cast 转换将得到一个NULL值。
ex:
B *pB = new B;
//pD1的结果会是一个NULL值,因为类型不匹配
D1 *pD1 = dynamic_cast<D1*>(pB);
if(pD1 == NULL ){...}
//pD2的值也会是一个NULL值,因为类型不匹配
D2 *pD2 = dynamic_cast<D2*>(new D1);
//pB1 不会是一个NULL值,因为类型匹配,并且是一个上行转换
B *pB1 = dynamic_cast<B*>(new D1);
(2)基本类型之间的转换:
基本类型,比如int, char, short 等之间的转换是默认完成的,或者通过static_cast 也可以。
ex:
int a;
char c = a;
char c1 = static_cast<char>(a);
(3)基本类型指针之间的转换
基本类型指针之间的转换只能使用 reinterpret_cast.
ex:
char *pChar;
byte *pByte = reinterpret_cast<byte*>(pChar);
(4).void* 和 基本类型指针、对象指针之间的转换
reinterpret_cast肯定是可以的。
static_cast也是可以的,static_cast就是为这个设计的。
ex:
byte *pByte = new byte;
void *pVoid = static_cast<void*>(pByte);
char *pChar = static_cast<char*>(pVoid);
dynamic_cast 只能用于 类对象指针到 void*的转换, 并且要求这个类具有虚函数表。
ex:
B *pB;
void *pVoid = dynamic_cast<void*>(pB);
pB = dynamic_cast<B*>(pVoid);//这里会报错,dynamic_cast不允许做这样的转换。这里可以换成 static_cast
(5). 数和指针之间的转换
数和指针之间的转换只能使用 reinterpret_cast.
ex:
int a=0x1234;
char* pChar = reinterpret_cast<char*>(a);
a = reinterpret_cast<int>(pChar);
3.const_cast
const_cast 是用来去除指针或者引用的 const 属性, 它的作用不是为了修改变量,而是为了能让函数接受这个变量作为参数。
- C#.NET 的 类型转换
- C语言的类型转换
- C语言的类型转换
- C语言的类型转换
- c语言的类型转换
- C++/C指针的类型转换
- <C/C++> 类型转换
- C/C++:类型转换
- C语言里的指针类型转换
- C#问题--如何转换数组的类型
- C语言类型转换的原则
- c语言的自动类型转换
- c语言的自动类型转换
- C语言的常用类型转换函数
- c语言的自动类型转换
- 【C#】中Decimal类型转换的问题
- 【C++】标准C++的类型转换符
- C#调用C++dll的类型转换
- java Integer.valueOf()方法
- 随笔2014-2-11(2)关于vmware tools出现问题
- 开源74个项目
- Javascript面向对象编程:构造函数的继承
- poj1083
- c++的类型转换
- Qt多线程概述
- Qt 中sax方式 解析 xml文件
- ARC使用心得
- iOS设计模式之观察者模式
- 类型System.Double的对象无法转换为类型System.Single
- ExtJS4.2基础知识之事件机制
- mysqli_result:fetch_all() 不识别的解决办法
- 图像连通域的标定(OpenCv版)