您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记之类型转换

2017-01-04 22:43 309 查看
C++类型转换笔记如下,方便下次查阅

1. 隐式类型转换

C++的内置不同类型的运算符可以混合到一个表达式中,编译器会尝试将它们转换成相同的数据类型,然后计算;如果不能进行转换编译器会报错误信息。
1. 如果有一个操作数的类型是long double,则将另一个操作数的类型转换为long double;
2. 否则,如果有一个操作数的类型是double,则将另一个操作数的类型转换为double;
3. 否则,如果有一个操作数的类型是float,则将另一个操作数的类型转换为float;
4. 否则,说明操作数是整形,因此执行整形提成;
5. 在这种情况下,如果两个操作数都是有符号或者无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型;
6. 如果一个操作数为有符号的,另一个操作数是无符号的,且无符号操作数的级别比有符号的操作数的级别高,则将有符号的操作数转换为无符号的操作数所属的类型;
7. 否则,如果有符号类型可以表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属类型;
8. 否则,将两个操作数都转换为有符号类型的无符号版本。(默认是有符号的,加一个限定词unsigned,声明是无符号版本)

C99明确定义了整形提升:

如果int能够表示原始类型中的所有数值,那么这个数值就被转成int型,否则,它被转成unsigned int型。这种规则被称为整型提升。所有其它类型都不会被整型提升改变。

2. 显示类型转换

显示转换也称作强制类型转换(cast),强制类型转换会关闭C++的类型检查,类型的安全需要程序员保证。
1)  static_cast
用法:static_cast <typeid> (expression)
说明:该运算符把expression转换为typeid类型,但没有运行时类型检查来确保转换的安全性。
用途:
a) 用于类层次结构中基类和派生类之间指针或者引用的转换。

上行转换up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的;

下行转换down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。
b) 用于基本数据类型之间的转换,如把int转换成char,这种转换的安全性也要由开发人员来保证。
c) 可以把空指针转换成目标类型的空指针(null pointer)。
d) 把任何类型的表达式转换成void类型。
注意: static_cast不能转换掉expression的const、volitale或者__unaligned属性。

编译器隐式转换都可以由static_cast显示完成, static_cast执行非多态的转换,用于代替C中通常的转换操作
2)dynamic_cast
用法:dynamic_cast <typeid> (expression)
说明:该运算符把expression转换成typeid类型的对象。typeid必须是类的指针、类的引用或者void*。

如果typeid是类的指针类型,那么expression也必须是指针;

如果typeid是一个引用,那么expression也必须是一个引用。

一般情况下,dynamic_cast用于具有多态性的类(即有虚函数的类)的类型转换(将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理)。
dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查。先看RTTI相关部分,通常,许多编译器都是通过vtable找到对象的RTTI信息的,这也就意味着,如果基类没有虚方法,也就无法判断一个基类指针变量所指对象的真实类型,这时候,dynamic_cast只能用来做安全的转换,例如从派生类指针转换成基类指针。而这种转换其实并不需要dynamic_cast参与。也就是说,dynamic_cast是根据RTTI记载的信息来判断类型转换是否合法的。
用途:主要用于类层次之间的up-casting和down-casting,还可以用于类之间的交叉转换。在进行down-casting时,dynamic_cast具有类型检查的功能,比static_cast更安全。检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(注:即隐式转
换的相反过程),dynamic_cast会检查操作是否有效。也就是说,
4000
它会检查转换是否会返回一个被请求的有效的完整对象。

dynamic_cast运算符可以在执行期决定真正的类型。如果 downcast 是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果
downcast 不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;

在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
注意:dynamic_cast不能转换掉expression的const、volitale或者__unaligned属性。
3) reinterpret_cast
用法:reinterpret_cast <typeid>(expression)
说明:转换一个指针为其他类型的指针,也允许将一个指针转换为整数类型,反之亦然。这个操作符能够在非相关的类型之间进行转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝,在类型之间指向的内容不做任何类型的检查和转换。这是一个强制转换。使用时有很大的风险,慎用之。
用途:

type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)

操作符修改可操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。
注意:reinterpret _cast不能转换掉expression的const、volitale或者__unaligned属性。
4)const_cast
用法:const_cast<typeid>(expression)
说明:修改类型的const或volatile属性,除了const
或volatile修饰之外, type_id和expression的类型是一样的。

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

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

三、const_cast一般用于修改底指针。如const char *p形式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: