显示类型转换
被称为强制类型转换(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++风格的强制性类型转换的更多相关文章

  1. 尽量采用as操作符而不是旧式C风格做强制类型转换

    http://www.cnblogs.com/JiangSoney/archive/2009/08/07/1541488.html MSDN: https://msdn.microsoft.com/z ...

  2. static_cast与c风格的强制类型转换比较

    转载:https://blog.csdn.net/whatday/article/details/50417503 class A { int a; }; class B { int b; }; cl ...

  3. C++_系列自学课程_第_11_课_类型转换_《C++ Primer 第四版》

    上次说了关于表达式的一些内容,说到还有一些关于数据类型转换的内容,今天我们接着八一八C++中的数据类型转换. 一.隐式类型转换 在表达式中,有些操作符可以对多种类型的操作数进行操作, 例如 + 操作符 ...

  4. dynamic_cast 和 static_cast 隐式类型转换的区别

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...

  5. 【面经】【转】C++类型转换

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:type b = (type) a. C++风格的类型转换提供了4种类型转换操作符来应对不同场景的应用. const_cas ...

  6. C++开发必看 四种强制类型转换的总结 [转]

    一.C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:     TYPE b = (TYPE)a 二.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. co ...

  7. C++开发必看 四种强制类型转换的总结

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast ...

  8. C++类型转换总结 转

    一.前言: C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a. C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. con ...

  9. c++的四种强制类型转换

    http://hb.qq.com/a/20110722/001452.htm ...... C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a ...

随机推荐

  1. equals()和hashCode()方法在集合类set中的使用

    Object的方法 equals()和hashCode() 是用来判断两个对象是否相等.基础类型判断是否相等时,使用“==”来判断,按java的说话,“==”当用来判断是基础类型是判断内容的,而引用对 ...

  2. list 类

    题外:len = sizeof(a)/sizeof(a[0]); 求出数组长度 1.list是一种以双向链表方式实现的一种顺序容器.list容器中,存放元素的存储单元可以是连续的也可以是不连续的. 2 ...

  3. 子元素浮动父容器高度不能自适应的CSS解决方法

    百度标题:子元素浮动父容器高度不能自适应的CSS解决方法 从第二份工作开始,已经不怎么写样式了,然后就忘记了一部分,有的也生疏了. 今天碰到子元素意外挤到一起的问题,就问公司前端工程师是怎么回事,F1 ...

  4. Struts2的文件上传与下载

    <一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...

  5. hdu 3501 容斥原理或欧拉函数

    Calculation 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. TroubleShoot: Excel Services Fix - "The workbook cannot be opened".

    1. 问题描述: 在SharePoint 2013 文档库中打开Excel 文件提示"The workbook cannot be opened" 错误提示框,文档不能正常显示. ...

  7. Linux 之 rsync实现服务器的文件同步

    rsync实现服务器的文件同步 参考文献链接: 一.rsync实现负载均衡集群文件同步,搭建线上测试部署环境 二.rsync. 三.rsync常见错误. 四.rsync 安装使用详解. 环境部署: 服 ...

  8. poj 2253(kruskal)

    Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34968   Accepted: 11235 Descrip ...

  9. js-数字渐增到指定的数字,在指定的时间内完成(有动画效果哦)插件jquery.animateNumber.js

    本来在项目中我自己实现的效果是数字由0渐增到指定的数字就好. 但是,最终效果不理想! Why? 最终指定的数字太大了,TMMD,滚动好久就不到,那用户想看自己有多少钱了,那不是就一直等着!!!所以这个 ...

  10. Go语言入门——数组、切片和映射(下)

    上篇主要介绍了Go语言里面常见的复合数据类型的声明和初始化. 这篇主要针对数组.切片和映射这些复合数据类型从其他几个方面介绍比较下. 1.遍历 不管是数组.切片还是映射结构,都是一种集合类型,要从这些 ...