c/c++类型转换相关总结
在c语言中存在两种类型转换:显式类型转换和隐式类型转换;
显示类型转换:在类型前加上(type)变量,对变量进行的转换,程序员自己显式添加;
char *ptra = (char*)ptrb;
void *ptrc = (void*)ptrd;
隐式转换:不同数据结构之间赋值和运算,函数调用传递参数时,编译器自动完成;
char ch = 0;
int i = ch;
在c++中的类型转换:
通过上面两种方式,c语言中大部分的类型转换都是以顺利进行。至于能不能进行转换,转换后的结果如何,编译器不管,需要用户自己去控制。
c++继承了c中的隐式和显式转换的方式。但是这种转换并不是安全和严格的,加上c++本身对象模型的复杂性,c++增加了四个显示转换的关键字。(c++是强类型语言)
(static_cast,dynamic_cast,const_static,reinterpret_cast)
1、static_cast
用法:static_cast<type-id>(exdivssion)
该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
它主要有如下几种用法:
1)用于类层结构中基类和子类之间指针或引用的转换。
进行上行转换是安全的。(把子类的指针或引用转换为基类表示)
进行下行转换时,由于没有动态类型检查,所以是不安全的。(把基类指针或引用转换成子类表示)
2)用于基本数据类型之间的转换,如把int转换成char,把int转换成enum,这种转换的安全性也要开发人员来保证。
3)把空指针转换成目标类型的空指针。
4)把任何类型的表达式转换成void类型。
注意:static_cast不能替换掉exdivssion的const、volitale、或者unaligned属性。
2、dynamic_cast
用法:dynamic_cast<type-id>(exdivssion)
该运算符把exdivssion转换成tepe-id类型的对象。type-id必须是类的指针、类的引用或者void*;
如果type-id是类指针类型,那么exdivssion也必须是一个指针,如果type-id是一个引用,那么exdivssion也必须是一个引用。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次进行上行转换时,dynamix_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_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<D*>(pb);
D* pd2 = dynamic_cast<D*>(pb);
}
在上面的代码中,如果pb只想一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的指针,对他进行D类型的操作将是不安全的(如访问m_szname),而pd2将是一个空指针。
另外要注意:dynamic_cast转换对象时被转换对象类型必须是多态类型,即被转换对象必须公有继承自其他类,或其拥有虚函数。即B要有虚函数,否则会编译错误;static_cast则没有这个限制,这是由于运行时类型检查需要运行时类型信息,而这个信息存储在累的虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。
另外,dynamic_cast还支持交叉转换(crosscast)。如下代码所示。
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)); //编译错误;
D *pd1 = dynamic_cast<D>((pb));
delete pb;
}
在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用dynamic_cast的转换则是允许的,结果是空指针;
3、reindivter_cast
用法:reindivter_cast<type-id>(exdivssion)
type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。
它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。
4、const_cast
用法:const_cast<type-id>(exdivssion)
该运算符用来修饰类型的const或volatile属性。除了const或volatile修饰之外,type_id和exdivssion的类型是一样的。
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;
常量对象被转换成非常量对象。
class B{
public:
int m_inum;
};
void foo(){
const B* b1;
bi->m_inum = 100;//comile error;
B* b2 = const_cast<B*>(b1);
b2->m_inum = 100;//ok;
}
c/c++类型转换相关总结的更多相关文章
- C++中,有哪4种与类型转换相关的关键字?各有什么特点?应该在什么场合下使用?
转:https://www.cnblogs.com/mjiang2017/p/9358032.html C++中,四个与类型转换相关的关键字:static_cast.const_cast.reinte ...
- c++中4个与类型转换相关的关键字分析
static_cast reinterpret_cast dynamic_cast const_cast 1.**static_cast------运算符完成相关类型之间的转换** 使用场景:如在同一 ...
- C++与类型转换相关的四个关键字及其特点
1.reinterpret_cast (expression) type-id 必须是一个指针.引用.算术类型.函数指针或者成员指针. 它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针( ...
- C++中4个类型转换相关的关键字/特点/应用场合
reinterpret_cast是C++里面的一个强制类型转换符,能够将任何的指针类型转换成其他的任何指针类型:能够将任何的整数类型转换成指针类型,反之亦然:滥用reinterpret_cast强制类 ...
- struts2类型转换相关问题
一.类型转化错误时,如何处理? 若Action类没有实现ValidationAware接口,在类型转化错误时,struts2会继续调用action方法,将该属性值置为默认值,不报错. 若Action类 ...
- SQL Server Cast、Convert数据类型转换
一.概述 本篇文章转载来着官网在线文档,文章主要介绍SQL Server数据类型转换相关语法.隐式转换.Date样式等. 语法 Syntax for CAST: CAST ( expression A ...
- Swift类型转换
关于「类型转换」(Type Casting),<The Swift Programming Language>描述如下: Type casting is a way to check th ...
- JavaScript 数据类型转换表
下表显示了将不同的JavaScript值转换为Number,String和Boolean的结果: 原始值 转换为Number 转换为String 转换为Boolean false 0 "fa ...
- c/c++面试题(1)
1.C++中有哪4个和类型转换相关的关键字?这些关键字都有什么特点?应该在哪些场合下使用. C语言中的强制类型转换可以随意的转换我们想要的类型了,格式如下(类型) 变量名; 为什么c++还要引入新的4 ...
随机推荐
- 笔记-python-functool-@wraps
笔记-python-functool-@wraps 1. wraps 经常看到@wraps装饰器,查阅文档学习一下 在了解它之前,先了解一下partial和updata_wrapper这两个 ...
- storm实时计算实例(socket实时接入)
介绍 实现了一个简单的从实时日志文件监听,写入socket服务器,再接入Storm计算的一个流程. 源码 日志监听实时写入socket服务器 package socket; import java ...
- python的高阶函数与匿名函数
一.高阶函数的定义 高阶函数:就是把函数当成参数传递的一种函数,例如: def add(x,y,f): return f(x)+f(y) print(add(-8,11,abs) 结果:19 解释: ...
- CentOS 7 安装Oracle 11gR2
概述 Oracle 在Linux和window上的安装不太一样,公司又是Linux系统上的Oracle,实在没辙,研究下Linux下Oracle的使用,oracle默认不支持CentOS系统安装,所以 ...
- 【vim环境配置】详细实录
[写在前面] 以下的所有内容主要参照: https://github.com/yangyangwithgnu/use_vim_as_ide . 原blog作者写的非常用心,建议大家都去看看.(个人觉得 ...
- linux下给开启端口
首先在这里要推荐一篇博文 http://blog.csdn.net/zht666/article/details/17505789 这篇文章写的很详细,里面包含了操作端口一些命令,我们操作端口其实就是 ...
- 为什么要内存对齐 Data alignment: Straighten up and fly right
转载于http://blog.csdn.net/lgouc/article/details/8235471 为了速度和正确性,请对齐你的数据. 概述:对于所有直接操作内存的程序员来说,数据对齐都是很重 ...
- UnitOfWork知多少 【转】
原文链接:https://www.cnblogs.com/sheng-jie/p/7416302.html 1. 引言 Maintains a list of objects affected by ...
- 孤荷凌寒自学python第五天初识python的列表
孤荷凌寒自学python第五天 列表 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 粗俗地区分列表,可以这样理解,定义或print列表后显示时,列表中的各元素都是用一个方括号[]括起来的. ...
- (原)Unreal-GamePlayer-Actor解析(1)
(原)Unreal-GamePlayer-Actor解析(1) @author 白袍小道 前言 属于Unreal的 GamePlay 框架中Actor细节部分.主要关于Actor及其相关部件和实体的几 ...