C++ 四种新式类型转换
static_cast ,dynamic_cast,const_cast,reinterpret_cast
static_cast
定义:通俗的说就是静态显式转换,用于基本的数据类型转换,及指针之间的转换,当需要把一个较大的算术类型赋值给较小的类型时,这个转换非常有用,任何具有明确定义的类型转换,只要不包含const,
都可以使用static_cast,格式如:static_cast<type-id>(expression),意为expression转换成type-id,但没有类型检查来保证转换的安全性
使用:(1) 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类是表示)是安全的;子类的对象一般比基类大
这就是为什么基类指针可以指向并创建一个子类对象,但子类指针不能指向基类对象,即是因为上行转换是安全的,下行转换有风险
(2) 进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的
(3) 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum等等,这种转换的安全性由开发人员来保证
(4) 把void指针转换成目标类型的指针(不安全!),因为已经分配了内存,在更换目标类型的时候可能因为内存导致程序崩溃
(5) 把任何类型的表达式转换成void类型
注意:static_cast不能转换掉expression的const,volitale,或者__unaligned属性
例如:int i = 0x7fff;long l;float f;
l = static_cast<long>(i);
i = static_cast<int>(l);
//以及把子类指针转换成基类指针等
dynamic_cast
定义:是用来执行继承体系中“安全的向下转型或跨系转型动作”,使用格式同static_cast,在进行下行转换时可以得知转型是否成功,如果转失败的是指针,那么会以一个null指针形式表现出来,如果是引用
那么会以一个expression表现出来
dynamic_cast与static_cast区别:static_cast全部用于明确定义的变换,包括编译器允许我们所做的不用强制转换的安全变换和不太安全但清楚定义的变换,
在进行类型间上行转换时,其和static_cast的效果是一样的,在进行下行转换时比static_cast更安全
例子:
class B {
public:
int m_iNum;
virtual void foo();
};
class D:public B {
public:
char *m_szName[100];
}
void func(B *pb) {
D *pd1 = static_cast(pb);
D *pd2 = dynamic_cast(pb);
}
在上面的代码中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的,因为它本身就是D类型的,所以没问题,而如果pb指向的是一个B类型的对象
那么pd1将是一个指向该对象的指针(不管是否有风险),对它进行D类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针,注意dynamic_cast转换时,B(基类)需要有虚函数,否则会编译出错
static_cast则没有这个限制,这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚表中
const_cast
定义:对“const”和“volatile”进行转换,最常见的用途就是将某个对象的常量性去掉,使用其他类型转换表达式的const属性都将引发编译器编译错误
例子:const char *pc; char *p = cosnt_cast<char *>(pc);//这种转换不能改变表达式的类型
reinterpret
转换为完全不同的意思,为了安全使用它,关键必须转换为原来的类型。转换成的类型一般只能用于位操作,否则就是为其他隐秘的目的,这是所有转换中最危险的,且跟平台有密切关系
C++ 四种新式类型转换的更多相关文章
- C++学习笔记 四种新式类型转换
static_cast ,dynamic_cast,const_cast,reinterpret_cast static_cast 定义:通俗的说就是静态显式转换,用于基本的数据类型转换,及指针之间的 ...
- 四种强制类型转换的总结(const_cast、static_cast、dynamic_cast、reinterpreter_cast)
四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast) 转载 2011年10月03日 23:59:05 标签: stru ...
- C++中的关键字用法--- 四种强制类型转换的总结
四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast 1. C风格的强制类型转换(Type Cast)很简单,不管什么类 ...
- C++中四种强制类型转换区别详解
C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 1.转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非const对 ...
- C++中的四种强制类型转换符详解
阅读目录 C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非con ...
- [转载]C++中四种强制类型转换方式
C++中四种强制类型转换方式 原文地址:http://www.cnblogs.com/home123/p/6763967.html 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单( ...
- 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...
- C++四种强制类型转换详解
什么是类型转换? 类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式.为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符. C与C++的类型转换 //C中: //复 ...
- C++提供的四种新式转换--const_cast dynamic_cast reinterpret_cast static_cast
关于强制类型转换的问题,许多书都讨论过,写的最具体的是C++之父的<C++的设计和演化>. 最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_c ...
随机推荐
- python写web服务器
#coding = utf-8 from http.server import BaseHTTPRequestHandler, HTTPServer class RequestHandler(Base ...
- 51nod 1020 逆序排列
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1020 题意: 思路: 一开始用了三重循环... 设f(n,k)表示n个数 ...
- MRO和C3算法
本节主要内容: 1.python多继承 2.python经典类的MRO 3.python新式类的MRO,C3算法 4.super() 一.python多继承 在python中类与类之间可以有继承关系, ...
- git界面里面复制粘贴
git界面里常用的粘贴方法: 1.Insert键或者Fn+Insert键 2.右键或者shift+右键 Paste 粘贴 3.还有一些设置可以用,在git面板中(或者右键),点击option选项 这里 ...
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) E. Cards Sorting 树状数组
E. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Educational Codeforces Round 23 D. Imbalanced Array 单调栈
D. Imbalanced Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- vue自定义错误界面
方案一: 当输入错误链接错误或者找不到页面,在router里可以定义一个404页面,具体可以这样做:在routes里面这样写: { path:'*', component:error, name:'e ...
- Event(事件)
1.ZC:之前一直没怎么用过 OpenEvent(...),这次试用居然老是报错... 弄了一下,貌似是 OpenEvent(...)的第一个参数设置成0了... FhEvent_Communicat ...
- vue-cli3快速创建项目
文档:https://cli.vuejs.org/zh/guide/ 条件: npm 更至最新 node >=8.9 1.全局安装 npm install -g @vue/cli 或 yarn ...
- Jmeter 接口测试知识梳理——持续集成篇
Jmeter 使用也有很长时间了,但是一直没有做一下知识梳理,近期会对公司同事做一下这方面的培训,借此机会,把使用过程中应用到的知识,或是遇到的问题,整理出来,方便大家学习! Jmeter + Ant ...