C++中四种类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast要点解析
1.static_cast
typename dst_ptr = static_cast<typename> (src_ptr)
可用于c++基本类型之间的转换,子类与派生类之间的指针转换,类不要求有虚函数。编译时检查转换有效性,不关联的类指针转换会在编译时报错。与dynamic_cast不同的是指向基类对象的指针也可以转换为派生类指针,而这种情况是不安全的,dynamic_cast在这种情况会返回NULL,因为派生类指针指向的并不是一个派生类对象。
2.dynamic_cast
typename dst_ptr = dynamic_cast<typename> (src_ptr)
基类必须有虚函数,否则编译出错。c++在运行时不关心指针是什么类型的,关心的是指针指向的对象是什么类型的,简单的一种情况是将基类对象赋值给派生类指针,那么在派生类指针访问派生类有而基类没有的方法时就会出现访问虚函数表崩溃,另外dynamic_cast还支持交叉转换,如下:
class A{public:int m_iNum;virtual void f(){}};class B:public A{};class D:public A{};void foo(){ B *pb = new B; pb->m_iNum = 100; D *pd1 = static_cast<D *>(pb); //compile error D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL delete pb; }
dynamic_cast是用的比较多的类型转换符,不过这个转换符在转换的时候有性能问题。
3.reinterpret_cast
typename dst_ptr = reinterpret_cast<typename> (src_ptr)
类似c的强制转换,不改变指针的值直接进行二进制的复制,不过不能移除const等修饰。
static_cast 和 reinterpret_cast 操作符修改了操作数类型,它们不是互逆的。
static_cast 在编译时使用类型信息执行转换,在转换执行必要的检测(诸如指针越界计算, 类型检查)。
4.const_cast
const typename dst_ptr = const_cast<const typename> (src_ptr)
typename dst_ptr = const_cast<typename> (src_ptr)
指针转换时移除指针的const属性或者添加非常量指针的const属性。
5.示例代码
#include <stdlib.h>
#include <stdio.h>class base
{
public:base() :m_base(1){printf("base\n");}virtual void myself(){printf("m_base\n");}
private:int m_base;
};class derive:public base
{
public:derive():m_derive(3),m_base(2){}virtual void myself(){printf("m_derive\n");}virtual void print(){printf("print\n");}
private:int m_base;int m_derive;
};class other
{
public:virtual void myself(){}
};int main(int argc, char* argv[])
{int count = 0;double score = 0.0;count = static_cast<int>(score);base ptr_base = base();base* ptr_base1 = new base();base* ptr_base2 = new derive();derive* ptr_derive1 = new derive();derive* ptr_derive2 = static_cast<derive *>(new base());//ptr_derive2->print();other* ptr_other1 = new other();//ptr_base1 = static_cast<base *>(ptr_derive1);ptr_derive1 = static_cast<derive *>(ptr_base1);//ptr_other1 = static_cast<other *>(ptr_base1);ptr_base1 = dynamic_cast<base *>(ptr_derive1);ptr_derive1 = dynamic_cast<derive *>(ptr_base1);ptr_other1 = dynamic_cast<other *>(ptr_base1);const base* cptr_base = new base();cptr_base = ptr_base1;ptr_base1 = const_cast<base *>(cptr_base);cptr_base = const_cast<const base *>(ptr_base1);cptr_base = ptr_base1;//ptr_base1 = reinterpret_cast<base *>(cptr_base);ptr_base1 = reinterpret_cast<base *>(ptr_derive1);ptr_base1 = reinterpret_cast<base *>(ptr_other1);return 0;
}
6.参考资料
http://blog.chinaunix.net/uid-26548237-id-3954104.html
http://www.cnblogs.com/carsonzhu/p/5251012.html
http://poplars.blog.163.com/blog/static/1394221742013021111210567/
C++中四种类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast要点解析相关推荐
- c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast
c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast [版权声明]转载请注明出处 http://www.cnblogs.co ...
- C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)
Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而 ...
- C++中四种类型转换方式
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a,但是c 风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型 ...
- C++中四种类型转换运算符的使用方法
C++的四个类型转换运算符已经有很久了,但一直没有弄清楚它们的用法,今天看到一本书上的解释,才大致地的了解了其具体的用法. 具体归纳如下: reinterpret_cast 该函数将一个类型的指针转换 ...
- 聊聊 C++ 中的四种类型转换符
一:背景 在玩 C 的时候,经常会用 void* 来指向一段内存地址开端,然后再将其强转成尺度更小的 char* 或 int* 来丈量一段内存,参考如下代码: int main() {void* pt ...
- QL Server 中四种匹配符的含义
SQL中我们会见到很多的匹配符,下面解释一下 % 代表零个或者多个任意字符_ 代表一个任意字符[] 指定范围内的任意单个字符[^] 不在指定范围内的任意单个字符带有匹配符的字符串必须使用引号引起来,例 ...
- java中四种修饰符
java的四个关键字:public.protected.default.private 适用范围<访问权限范围越小,安全性越高> 访问权限 类 包 子类 其他包 pub ...
- 【C++】类型转换简述:四种类型转换方式的说明及应用
本文主要简述在C++中四种类型转换的方式:static_cast.reniterpret_cast.const_cast和dynamic_cast. 在介绍C++类型转换方式之前,我们先来看看C语言的 ...
- C++中四种cast转换
C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast 1.const_cast 用于将const变量转为非const ...
最新文章
- 个人销售建筑服务器,建筑个人云服务器
- Mac 上 iterm2 和 VSCode 终端中的字体设置建议
- python3.6安装pygame-Pygame 框架安装教程(Python3.6为例)
- (转载)你好,C++(19)“老师,我这次四级考试过了没有?”——4.2 条件选择语句...
- restful get不传参数404_你知道什么是 Restful 风格吗?SpringMVC 带我们实现它!
- pads铺铜不能开启drp_PADS中常见问题解决方案
- 猫狗动物声音模拟器微信小程序源码
- 通过kubeadm的方式以及二进制包的方式安装k8s的对比总结---K8S_Google工作笔记0016
- ​​spss13.0 附安装教程
- win95软盘版安装方法
- Greenplum单机版安装
- 【Arduino】入门篇——人体红外自动报警
- 支持在线大数据SQL查询平台开源项目
- 关于ES5和ES6的简介
- R730 LCD屏提示:PDR1016 drive 7 removed from disk drive bay 1.Check drive.R730 LCD屏提示:PDR1016 drive 7 r
- Flat风格的Qml滚动选择条
- SINS_Kalman
- python 将图片转换成像素画_Python 骚操作之图片转字符画
- java关键字的作用_java关键字及其作用
- JAVA 中文汉字转换阿拉伯数字(最终版,已修复了亿及亿以下的汉数字的转换,超过后的数字,暂时不支持)