C++中四种强制类型转换的区别
来源:互联网 发布:3d定制女仆mac 编辑:程序博客网 时间:2024/05/19 12:41
1、static_cast
用法:static_cast<type_id> (expression)
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
(1)用于类层次结构中基类和派生类之间指针或引用的转换
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的
(2)用于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证
(3)把空指针转换成目标类型的空指针
(4)把任何类型的表达式转换为void类型
使用:
class CBase {
virtualvoid foo(){};
};
class CDerived : public CBase
{
public:
char*m_szName[100];
};
class CFerived : public CBase
{
};
//static_cast转换
CBase*pB = NULL;
CDerived*pD = NULL;
pB= static_cast<CBase *>(pD);//向上转换 安全
pD= static_cast<CDerived *>(pB);//向下转换 不安全
CBaseB;
CDerivedD;
B= static_cast<CBase>(D);//派生类对象转换成基类对象
//D= static_cast<CDerived>(B);//基类对象不能转换成派生类对象
inttsdfe = 1;
//chars = "de";
//s= static_cast<char>(tsdfe);//用于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证
void*pTemp = NULL;
CDerived* pTag = NULL;
pTag= static_cast<CDerived *>(pTemp);//把空指针转换成目标类型的空指针
2、dynamic_cast
用法:dynamic_cast<type_id>(expression)
该运算符把expression转换成type_id类型的对象。type_id必须是类的指针、引用或者void*;
如果type_id是类指针类型,那么expression也必须是一个指针,如果type_id是一个引用,那么expression也必须是一个引用。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
//dynamic_cast动态转换
//这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(
// 关于虚函数表的概念,详细可见<Insidec++ object model>)中,只有定义了虚函数的类才有虚函数表,
// 没有定义虚函数的类是没有虚函数表的。
CBase*PB1 = new CBase();//指向CBase对象的CBase指针,
CBase*PB2 = new CDerived();//指向CDerived对象的CBase指针,
//CDerived*pd1 = static_cast<CDerived *>(PB1);
CDerived*pd1 = dynamic_cast<CDerived *>(PB2);//安全
CDerived*pd12 = static_cast<CDerived *>(PB2);//安全
CDerived*p1d1 = dynamic_cast<CDerived *>(PB1);//一个空指针
CDerived*p1d2 = static_cast<CDerived *>(PB1);//一个指向该对象的指针,对它进行CDerived中有的CBase中没有类型的操作将是不安全的
//dynamic_cast还支持交叉转换结果是空指针。
//例如:
//CBase*B1 = new CBase();
CDerived*D1 = new CDerived();
CFerived*F1 = NULL; //= new CFerived();
F1= dynamic_cast<CFerived *>(D1);//F1是空指针
//F1= static_cast<CFerived *>(D1);//程序报错
- C++中四种强制类型转换的区别
- C++中四种强制类型转换的区别
- C++中四种强制类型转换的区别
- C++中四种强制类型转换的区别
- C++中四种强制类型转换的区别
- c++-----强制类型转换
- 【C++】强制类型转换
- C 强制类型转换
- C 强制类型转换
- C 强制类型转换
- C++中四种强制类型转换操作符之间的区别
- 解析C++中四种强制类型转换的区别详解
- 解析C++中四种强制类型转换的区别详解
- 解析C++中四种强制类型转换的区别详解
- as和()强制类型转换的区别
- as和强制类型转换的区别
- static_cast与强制类型转换的区别
- 【C++】类型强制转换的注意事项
- struts2 中,使用了 Rest与Convention插件后,访问 动态方法 的注意点
- 使用nc检测udp端口是否可以正常通讯
- Android Plugin 插件化技术:DroidPlugin
- margin和border-style的用法
- CSS-Day03-CSS样式-文本
- C++中四种强制类型转换的区别
- tcpdump抓包命令详解
- text-align 和 align的区别
- 人活着就是个心态
- java 调用 keytool 生成keystore 和 cer 证书
- 字母概率
- 单例模式的多线程安全支持(C++)
- MYSQL 研发规范
- 数字证书文件格式(cer和pfx)的区别