4 type cast operators in C++
2011-01-04 21:57
302 查看
摘自《高质量程序设计指南》第3版(林锐,韩永泉)263页。
C++新增了4个类型转换运算符,它们是:
1. static_cast<dest_type>(src_obj),作用相当于C风格的强制转换,但是在多重继承的情况下,它会正确地调整指针的值(即确定dest_type类型的指针应该指向src_obj中的什么位置),而C风格的强制转换则不会调整;它可以遍历继承树来确定src_obj与dest_type的关系,但是只在编译时进行(此所谓静态);如果使用它来做downcast操作(即把一个base class的指针转换成一个derived class的指针,当然那个base class的指针最好原是指向一个derived class的对象,这个过程应该调用dynamic_cast来完成),则会存在隐患。
2. const_cast<dest_type>(src_obj),用于去除一个对象的const/volatile属性。
3. reinterpret_cast<dest_type>(src_obj),我们可以借助它把一个整数转换成一个地址,或者在任何两种类型的指针之间转换。使用该运算符的结果很危险,请你不要轻易使用。
4. dynamic_cast<dest_type>(src_obj),在运行时遍历继承树(类层次结构)来确定src_obj与dest_type的关系,具体在本书第15章讲述。
补充:1)C++中默认执行的转型操作是static_cast,手工执行static_cast时需确保dest_type和src_obj间应存在一定的关系,如继承关系等。对2种没有任何关系的ADT进行static_cast会产生编译错误,此时需用reinterpret_cast完成,但无法保证转型后的数据有意义。2)用const_cast来去除一个对象的const属性时,如用普通指针指向一个const对象,未必可以修改原对象的值。如果原对象是个ADT常量,则可以修改成功;若原对象为基本数据类型的常量,则无法成功。这和不同类型的常量相异的存储方式有关系。
C++新增了4个类型转换运算符,它们是:
1. static_cast<dest_type>(src_obj),作用相当于C风格的强制转换,但是在多重继承的情况下,它会正确地调整指针的值(即确定dest_type类型的指针应该指向src_obj中的什么位置),而C风格的强制转换则不会调整;它可以遍历继承树来确定src_obj与dest_type的关系,但是只在编译时进行(此所谓静态);如果使用它来做downcast操作(即把一个base class的指针转换成一个derived class的指针,当然那个base class的指针最好原是指向一个derived class的对象,这个过程应该调用dynamic_cast来完成),则会存在隐患。
2. const_cast<dest_type>(src_obj),用于去除一个对象的const/volatile属性。
3. reinterpret_cast<dest_type>(src_obj),我们可以借助它把一个整数转换成一个地址,或者在任何两种类型的指针之间转换。使用该运算符的结果很危险,请你不要轻易使用。
4. dynamic_cast<dest_type>(src_obj),在运行时遍历继承树(类层次结构)来确定src_obj与dest_type的关系,具体在本书第15章讲述。
补充:1)C++中默认执行的转型操作是static_cast,手工执行static_cast时需确保dest_type和src_obj间应存在一定的关系,如继承关系等。对2种没有任何关系的ADT进行static_cast会产生编译错误,此时需用reinterpret_cast完成,但无法保证转型后的数据有意义。2)用const_cast来去除一个对象的const属性时,如用普通指针指向一个const对象,未必可以修改原对象的值。如果原对象是个ADT常量,则可以修改成功;若原对象为基本数据类型的常量,则无法成功。这和不同类型的常量相异的存储方式有关系。
相关文章推荐
- 4 type cast operators in C++
- C++错误集锦之:error C2243: 'type cast' : conversion exists, but is inaccessible
- Type cast in C++
- Which variables should I typecast when doing math operations in C/C++?
- (ZZ)About Cast in C++(C++中的类型转换)
- Effective C++ Item 10,11 Have assignment operators return a reference to *this Handle assignment to self in operator =
- C++类型转换关键字 *_cast<type> (expression)
- c++ 之 reinterpret_cast <new_type> (expression) 常见用法
- Xcode更新到5.1,"Cast from pointer to smaller type 'int' loses information” in EAGLView.mm
- [Topic]Advanced Run Time Type Identification in C++
- c\c++复习基础要点15----c++运行时类型识别 dynamic_cast typeid type_info
- C++ 使用oci访问数据库出现“Column: 2<DOUBLE>, datatype in operator <</>>: CHAR”
- Regular cast vs. static_cast vs.dymamic_cast in C++
- C++中类型转换(Type Conversions in C++)
- Understanding Dynamic_cast in C++
- c++ type cast
- Type conversions in C++类型转换
- type dedution and reference collapse in c++ 11(works vc++ 2013)
- Question 10: Given the following program snippet, what can we conclude about the use of dynamic_cast in C++?
- C++标准转换运算符 :reinterpret_cast <new_type> (expression)