C++风格的强制性类型转换
显示类型转换
被称为强制类型转换(cast)
C风格:(type_id)
C++风格:static_cast, dynamic_cast, reinterpret_cast, const_cast
在《C++的设计和演化》中告诉我们,解决强制性类型转换的最好的解决方法是使用标准的C++的类型转换,也就是上面提到的四个类型转化。下面我们来看看这几个的区别。
static_cast:用法:static_cast(expression)
该运算符把expression转换为type_id类型,但没有运行时的检查来保证转换的安全性。
使用static_cast的情况:1.void指针转其它类型的指针,2.改变通常的的标准转换,3.避免出现可能多种转化的歧义
具体使用情况如下:a.用于类中基类和子类之间指针或引用的转换,进行上行转行,就是把子类的指针或引用转换成基类表示是安全的,相反这是不安全的,原因是没有类型安全检查。
dynamic:dynamic_cast(expression)
该运算符把expression转换成type-id,且这两部分必须是类的指针,类的引用或者void*。
dynamic_cast主要用于类层次间的上行转换下行转换,还可以用于类之前的交叉转换。在上行转换的时候它和 static_cast效果是一样的,在下行转换时,dynamic_cst更安全,应为它具有类型安全功能检查。dynamic_cast还可以使用如下的交叉的类型转换。
class A
{
publc:
int num;
virtul void f(){}
};
class B:public A
{
};
class C: public A
{
};
void f()
{
B* pb1 = new B;
pb1->num = 4;
C* pc1 = static_cast<C*>(pb1);
C* pc1 = dynamic_cast<C*>(pb1);
delete pd1;
}
在上述的函数f中static_cast进行转换是错误的,编译的时候编译器会终止编译,但是dynamic_cast是允许的,结果是空指针。
reinpreter_cast*(expression) type-id 必须是一个指针,引用,算数类型,函数指针或者成员指针。可以把一个指针转换成一个整数,也可以反过来把一个整数转换成一个指针。
const_cast:用法:const_cast(expression)
该运算符用来修改类型的const或volatile属性,除了const和volatile修饰之外type_id和expression的类型是一样的。下面来一个简单列子:
class B{
public:
int iNum;
};
void f()
{
const B b1;
b1.iNum = 100;
B b2 = const_cast(b1);
b2.iNum = 200;
}
上面的b1那里修改值是会报错的,但是b2那里是不会报错的,用为用了cosnt_cast。
C++风格的强制性类型转换的更多相关文章
- 尽量采用as操作符而不是旧式C风格做强制类型转换
http://www.cnblogs.com/JiangSoney/archive/2009/08/07/1541488.html MSDN: https://msdn.microsoft.com/z ...
- static_cast与c风格的强制类型转换比较
转载:https://blog.csdn.net/whatday/article/details/50417503 class A { int a; }; class B { int b; }; cl ...
- C++_系列自学课程_第_11_课_类型转换_《C++ Primer 第四版》
上次说了关于表达式的一些内容,说到还有一些关于数据类型转换的内容,今天我们接着八一八C++中的数据类型转换. 一.隐式类型转换 在表达式中,有些操作符可以对多种类型的操作数进行操作, 例如 + 操作符 ...
- dynamic_cast 和 static_cast 隐式类型转换的区别
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...
- 【面经】【转】C++类型转换
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:type b = (type) a. C++风格的类型转换提供了4种类型转换操作符来应对不同场景的应用. const_cas ...
- C++开发必看 四种强制类型转换的总结 [转]
一.C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a 二.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. co ...
- C++开发必看 四种强制类型转换的总结
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast ...
- C++类型转换总结 转
一.前言: C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a. C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. con ...
- c++的四种强制类型转换
http://hb.qq.com/a/20110722/001452.htm ...... C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a ...
随机推荐
- 安装anaconda并配置环境
安装anaconda的步骤 1.确定系统信息 uname -a 2.下载对应版本 3.sh 安装shell脚本 4.添加到对应路径 5.安装完anaconda之后,创建虚拟环境 conda creat ...
- HDU2013 蟠桃记【递推】
Problem Description 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!什么问题?他研究的问题是蟠桃一共有多少 ...
- java面试题之HashMap和TreeMap的区别
HashMap和TreeMap的区别 相同点: 都是以key和value的形式存储: key不可以重复: 都是线程不安全的: 不同点: HashMap的key可以为空 TreeMap的key值是有序的 ...
- cf671B Robin Hood
We all know the impressive story of Robin Hood. Robin Hood uses his archery skills and his wits to s ...
- 【bzoj4596】[Shoi2016]黑暗前的幻想乡 (矩阵树定理+容斥)
Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日高谈所有妖怪平等 ...
- CI调试应用程序
该分析器将在页面下方显示基准测试结果,运行过的 SQL 语句,以及 $_POST 数据.这些信息有助于开发过程中的调试和优化. 在控制器中设置以下方法以激活该分析器: $this->output ...
- delphiIDE 把 window 桌面改慢后的 还原方法
在开始搜索框中键入services.msc,然后按回车键,打开服务列表. 重启这个服务就可以了.
- 富文本ZSSRichTextEditor之趟坑集锦
富文本ZSSRichTextEditor是iOS原生与网页交互的集大成者,各种交互.自然问题也是多多,这篇文文章陆续更新遇到的奇葩问题. 1.问题1:从头条这种文章里头复制粘贴的文章,里边有图片,我们 ...
- tableView刷新中的问题
在开始之前先上一张效果图 相信大家都看到了“店铺优惠”这一栏,在这里假设这一栏就是单独的一个cell,当无店铺优惠的时候不可点击在有店铺优惠的时候会弹出优惠列表,选中并返回时会刷新数据,所以弹出视图采 ...
- Network | Public-key cryptography
公开密钥加密public-key cryptography,也称为非对称(密钥)加密. 非对称密钥,是指一对加密密钥与解密密钥,这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密 ...