static_cast, dynamic_cast探讨
来源:互联网 发布:网络歌我们都是东北人 编辑:程序博客网 时间:2024/05/10 08:29
static_cast
用法:static_cast < type-id > ( expression )
说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
它主要有如下几种用法:
用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。
用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
把void指针转换成目标类型的指针(不安全!!)
把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
#include "stdafx.h"#include<iostream>using namespace std;class Base{protected: int size;public: void setSize(int n) { size = n; }};class Derived:public Base{public: Derived(int n) { size = n; cout << "构造结果" << size << endl; } void setSize1(int n) { static_cast<Base *> (this)->setSize(n); cout << "this指针结果" << size<<endl; } void setSize2(int n) { static_cast<Base>(*this).setSize(n); //实际上是生产一个base class 对象副本,改变的是副本里面的size值,this里面的size值不变 cout << "this对象结果" << size<<endl; } void setSize3(int n) { Base::setSize(n); cout << "Base set_size结果" << size << endl; } void setSize4(int n) { static_cast<Base&>(*this).setSize(n); cout << "this引用结果" << size << endl; }};int _tmain(int argc, _TCHAR* argv[]){ Derived d(0); d.setSize1(1); d.setSize2(2); d.setSize3(3); d.setSize4(4); return 0;}
结论:使用static_cast进行向上转型时,应使用指针或引用;(不宜使用static_cast进行向下转型,应使用dynamic_cast)
dynamic_cast
**用法:**dynamic_cast < type-id > ( expression )
说明:该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
来源:为什么需要dynamic_cast强制转换?
简单的说,当无法使用virtual函数的时候
在交叉转换时,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- static_cast, dynamic_cast, const_cast探讨
- IOS 之 Quartz 2D 绘图(下)
- Android图片使用采样率压缩
- Android L——RecyclerView,CardView导入和使用(Demo)
- C#程序员开发WinForm必须知道的 Window 消息大全
- 现代嵌入式计算 - 第4章 - 嵌入式平台架构 (第2部分, 易失性存储器技术)
- static_cast, dynamic_cast探讨
- oracle学习总结----oracle常用命令
- BUS
- C语言中的几种排序方法
- PHP中const和define()定义常量的细节区别
- C和指针读书笔记(第一章)
- OSI七层与TCP/IP五层网络架构详解
- struts2 快速开发模式
- DES译码程序的MFC实现