设为首页 加入收藏

TOP

C++里的强制类型转换符reinterpret_cast、static_cast 、dynamic_cast、const_cast 区别讲解(二)
2018-05-06 06:06:38 】 浏览:462
Tags:强制 类型 转换 reinterpret_cast static_cast dynamic_cast const_cast 区别 讲解
数表的。

另外,dynamic_cast还支持交叉转换(cross cast)。如下代码所示。

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(pb); //compile error

D *pd2 = dynamic_cast(pb); //pd2 is NULL

delete pb;

}

在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。

const_cast

用法:const_casttype_id (expression)

该运算符用来去掉类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

{

const_cast Operator

const_cast < type-id > ( expression )

The const_cast operator can be used to remove the const, volatile, and __unaligned attribute(s) from a class.

}

常量指针被转化成非常量指针,并且仍然指向原来的对象;

常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

Voiatile和const类试。举如下一例:

class B{

public

int m_iNum;

}

void foo(){

const B b1;

b1.m_iNum = 100;//comile error

B b2 = const_castB(b1);

b2. m_iNum = 200;//fine

}

上面的代码编译时会报错,因为b1是一个常量对象,不能对它进行改变;

使用const_cast把它转换成一个常量对象,就可以对它的数据成员任意改变。注意:b1和b2是两个不同的对象。

---------------------------------------------------------------------------------

在网上找了上述内容,转载在这里。我自己也说两句吧,C++的类型转换明显比C里面的用()的类型转换要严谨很多。首先,C++样式的类型转换编写 的代码更容易维护,想想看,只要搜索“static_cast”,就可以找出代码中所有使用了静态转换的代码,比C里面五花八门的 (long) (long*) (double )好找多了吧。另外,reinterpret_cast,看字面意思就知道,是保持二进制位不变,用另一种格式来重新解释,我们也知道计算机里面只有 bit,到底代表什么类型,整形还是浮点型,全在于应用程序怎么解释每一个bit,reinterpret_cast给了我们这么一个机会。而C里面要想 二进制重解释,你要么拷贝内存,要么还是用()来强制类型转换,某些特定情况下,()强制转换其实是二进制的重解释,毫无疑问,C风格的转换会让代码变得 难懂。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c++ template模板使用实例 下一篇C++实现后门的服务自启动

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目