C++中4种强制类型转换

不过为了完成强制类型转换,C++中已经为我们提供了4中标准方法,它们是dynamic_cats, static_cast, const_cast, reinterpret_cast,用法形式为:dynamic_cast<类型说明符>(表达式),之所以分成4类,就表示他们各自有着不同的使用环境,下面转载的文章会有详细的说明。

const_cast,字面上理解就是去const属性。
static_cast,命名上理解是静态类型转换。如int转换成char。
dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多台类型转换。
reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。

const_cast 去掉类型的const或volatile属性。

static_cast

类似于C风格的强制转换。无条件转换,静态类型转换。用于: 1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast) 2. 基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。 3. 把空指针转换成目标类型的空指针。 4. 把任何类型的表达式转换成void类型。 5. static_cast不能去掉类型的const、volitale属性(用const_cast)。

dynamic_cast 有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL): 1. 安全的基类和子类之间转换。 2. 必须要有虚函数。 3. 相同基类不同子类之间的交叉转换。但结果是NULL。

reinterpreter_cast 仅仅重新解释类型,但没有进行二进制的转换: 1. 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。 2. 在比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。 3. 最普通的用途就是在函数指针类型之间进行转换。 4. 很难保证移植性。

总结 去const属性用const_cast。 基本类型转换用static_cast。 多台类之间的类型转换用daynamic_cast。 不同类型的指针类型转换用reinterpreter_cast。

关于强制类型转的操作结果问题,可以简单总结为non-pointer变量,即基本类型和类类型产生临时变量。而指针变量只是编译器对其的解释方式不同而已,因此类型转换也是对其本身操作的,也就是改变了解释方式。另外变量的去const与加const转换也是在变量上直接操作,因为const是欺骗编译器的一个标志。

时间: 2024-09-29 06:01:51

C++中4种强制类型转换的相关文章

C++中四种强制类型转换的区别

使用标准C++的类型转换符:static_cast.dynamic_cast.reinterpret_cast和const_cast.1.static_cast    用法:static_cast<type_id> (expression)    该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有如下几种用法:    (1)用于类层次结构中基类和派生类之间指针或引用的转换    进行上行转换(把派生类的指针或引用转换成基类表示)是安全的 

C++中四种强制类型转换方式

类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些.还有一个缺点就是,c风格的转换不容易查找,他由一个括号加上一个标识符组成,而这样的东西在c++程序

C++中的向上类型转换和向下类型转换+四种强制类型转换

转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类,和基类向子类的强制类型转换. 向上强制类型转换 切割:覆盖方法和子类数据丢失的现象生成切割(slice) class Base { public: int b; virtual void Test() { cout << "base" <<en

C#中,三种强制类型转换的对比

在C#中,我们可以看到三种强制类型转换,比如强制转换成有符号32位整型,可以找到下面三种方式: ① (int)()                ②Convert.ToInt32()         ③int.Parse() 三种转变在有些数据时可以通用,但是用法上仍然有很大的区别 (int)表示使用显式强制转换,是一种类型转换.当我们从 int 类型到 long.float.double 或decimal 类型,可以使用隐式转换,但是当我们从 long 类型到 int  类型转换就需要使用显式

C++中的关键字用法--- 四种强制类型转换的总结

四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast 1. C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a 2. C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,调用形式如:TYPE B = static_cast(TYPE)(a) const_cast,字面上理解就是去const属性. static_cast,命名上理解是静态类型转换

C++四种强制类型转换

四种强制类型转换:static_cast    const_cast    dynamic_cast     reinterpret_cast 1.static_cast 编译器隐式执行的任何类型转换都可以由static_cast显示完成. ①用于类层次结构中基类和子类之间指针或引用的转换. 进行上行转换(把子类的指针或引用转换成基类表示)是安全的: 进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的. ②用于基本数据类型之间的转换,如把int转换成char,

C++ 4种强制类型转换

C++的四种强制类型转换为:static_cast.const_cast.reinterpret_cast和dynamic_cast 类型转换的一般形式:cast-name static_cast 任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast: double slope = static_cast 注: 顶层const:表示指针本身是个常量.如:int *const p: 底层const:表示指针所指的对象是一个常量.如:int const *p: co

C++的四种强制类型转换和一个有趣的例子

又是程序员面试宝典,又是被虐的死去活来.这次是dynamic_cast.得,查资料加总结吧 C++有四种强制类型转换,分别是 static_cast, dynamic_cast, reinterpret_cast, const_cast ,这四种转换网上一大堆讲解 比如 Jerry19880126的http://www.cnblogs.com/jerry19880126/archive/2012/08/14/2638192.html 和 bamb00的http://www.cnblogs.com

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

一.C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:     TYPE b = (TYPE)a 二.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast,字面上理解就是去const属性. static_cast,命名上理解是静态类型转换.如int转换成char. dynamic_cast,命名上理解是动态类型转换.如子类和父类之间的多态类型转换. reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换. 4种