显示类型转换
被称为强制类型转换(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. [python学习篇][系统学习][1]python标准库中文、英文网址(一些内建函数,标准库都可以在这里查找)

    http://docspy3zh.readthedocs.io/en/latest/library/   半中文网址 http://usyiyi.cn/translate/python_278/lib ...

  2. pip installl安装包特别慢? 指定源进行安装

    指定源地址安装: pip install -i http://pypi.douban.com/simple/ packagename pip install -i http://pypi.tuna.t ...

  3. 【java基础 15】java代码中“==”和equals的区别

    导读:昨夜闲来无事,和贾姑娘聊了聊java基础,然后就说到了这个"=="和equals的问题,我俩都是以前了解过,也常用这个,但是,昨天说到的时候,又乱了,什么比较地址值,什么判断 ...

  4. poj 1523 SPF 求割点以及删除该割点后联通块的数量

    SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7136   Accepted: 3255 Description C ...

  5. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  6. HDU——1062Text Reverse(水题string::find系列+reverse)

    Text Reverse Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  7. BZOJ4033 [HAOI2015]树上染色 【树形dp】

    题目 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间 ...

  8. jquery不同版本导致的checkbox设置了属性,但是没有选中效果

    由于本人好久不做B/S了,今天同学问我个问题才发现了jquery版本还是存在差异的,今天写的就是关于获取checkbox属性的方式(可能不应该叫属性了其实,后面就知道了). 看下面的代码截图吧 < ...

  9. xsy 1836 - Shop

    from NOIP2016模拟题36 Description 商店里有n种背包和m种物品,物品体积为1到m,背包容积<=m 给出n个背包的容积 现在要求出这样一个物品集合,满足: 1)对于任意一 ...

  10. canvas之webgl的浏览器开启方式

    引自百度知道的回答 1.开启方式: 第一种:打开cmd,切换到Chorme的安装目录,敲入chrome.exe --enable -webgl,回车就会打开一个chrome浏览器窗口: 第二种:找到C ...