博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++学习之static_cast和dynamic_cast、reinterpret_cast
阅读量:6161 次
发布时间:2019-06-21

本文共 2117 字,大约阅读时间需要 7 分钟。

原文链接:

C++提供了四个转换运算符:
const_cast <new_type> (expression)
static_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
dynamic_cast <new_type> (expression)
 
 
dynamic_cast:   通常在基类和派生类之间转换时使用;  
static_cast:   一般的转换,如果你不知道该用哪个,就用这个。   
reinterpret_cast:   用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。
 
 
static_cast在编译时期强制转换,dynamic_cast在运行时期转换(较安全) ,reinterpret_cast主要是将数据从一种类型的转换为另一种类型。
static_cast是c语言的强制转换代替品,dynamic_cast可以帮助你实现虚函数的功能!reinterpret_cast它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针!
 
static_cast和dynamic_cast是c++中的rtti的两个操作符。  
其中static_cast是相当于c的强制类型转换,用起来可能有一点危险。
dynamic_cast如果转换成引用出错的话,就会出现异常,
 
这里需要做一个异常处理的机制。转换指针出错返回null。  
dynamic_cast可以转换指针和和引用(基类到派生类),不能用来转换对象."安全的向下转换",它通过c++的dynamic_cast运算符来实现。
 
当对一个指针使用dynamic_cast时,先尝试转换,如果成功,就返回新类型的合法指针;如果dynamic_cast失败,返回空指针!
 
//运行如下程序
[cpp] view plaincopy
#include <iostream>  
using namespace std;  
class A  
{  
   public:  virtual void show()  
    {  
     std::cout<<"A::show()"<<endl;  
    }  
};  
class  B : public A   
{  
   public: virtual void show()  
   {   
    std::cout<<"B::show()"<<endl;  
    }  
};  
  
int main()  
{  
   A *pa=new A();  
   B *pb=new B();  
   cout<<"-------- 1 ----------"<<endl;  
   static_cast<A *>(pb)->show(); //print:"B::show()"  
   cout<<"-------- 2 ----------"<<endl;  
   dynamic_cast<A *>(pb)->show();//also print:"B::show()"  
   cout<<"-------- 3 ----------"<<endl;  
   static_cast<B *>(pa)->show(); //print:"A::show()"   
   cout<<"-------- 4 ----------"<<endl;  
   //dynamic_cast<B *>(pa)->show(); //此处会出现异常  
   if((pb = dynamic_cast<B*>(pa)))  
     {  
        pb->show();  
     }else  
     {  
       cout << "dynamic cast fail" << endl;  
    }  
}  
 
输出为:
-------- 1 ----------
B::show()
-------- 2 ----------
B::show()
-------- 3 ----------
A::show()
-------- 4 ----------
dynamic cast fail
 
记住:如果使用VC编译的话,一定要选择上RTTI支持,否则运行时会出异常的。
static_cast并不允许两个完全不相干的类互相转换.
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。
reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。
 
OK下面看一个static_cast和reinterpret_cast的实例:
[cpp] view plaincopy
int i;  
char s = 'a';  
i = static_cast<int>(s);  
cout << i << endl;  
  
char *ss = "ssss";  
i = reinterpret_cast<int>(ss);  
cout << i << endl;  

转载地址:http://emhfa.baihongyu.com/

你可能感兴趣的文章
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>
cacti分组发飞信模块开发
查看>>
浅析LUA中游戏脚本语言之魔兽世界
查看>>
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
活在当下
查看>>
每天进步一点----- MediaPlayer
查看>>
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>
Skip List——跳表,一个高效的索引技术
查看>>