c++笔记 显式类型转换static_cast、dynamic_cast、const_cast、reinterpret_cast
2012-04-05 18:13
218 查看
旧式强制类型转换,用圆括号将类型括起来实现:
int *ip;
char *pc = (char*) ip;
效果与使用reinterpret_cast符号相同,但这种强制类型转换的可视性比较差,难以跟踪错误的转换。标准c++为了加强类型转换的可视,引入命名的强制转换操作符。
1.dynamic_cast
dynamic_cast支持运行时识别指针或引用的指向的对象。可以将基类类型对像的引用 或指针转换为同一继承层次中其他类型的引用或指针。dynamic_cast涉及运行时类型检查。如果绑定到引用 或指针的对像不是目标类型的对像,则dynamic_cast失败。因此,dynamic_cast一次执行两个操作,首先判断被请求的转换是否有效,只有转换有效,操作符才实际进行转换。
将基类引用 转换为派生类引用,这种dynamic_cast操作的形式如下:
dynamic_cast<Type& >(val)
2.const_cast
去掉变量的const属性,尽量少用。
3.static_cast
编译器隐匿执行的任何类型转换都可以由static_cast显式完成:
double d = 97.0;
char ch = static_cast<char>(d);
对于一个较大的算术类型到一个较小类型的赋值,编译器通常会产生警告。显式地提供强制类型转换时,警告信息就会被关闭。
如果编译器不提供自动转换,如使用static_cast找回存放在void*指针中的值:
void *p = &d;
double *dp = static_cast<double*>(p);
4.reinterpret_cast
reinterpret_cast通常为操作数的位模式提供较低层次重新解释,与旧式强制转换完全一样。这种类很不安全,尽量不用。
摘自c++primer。
PS:2012-04-19 消除从BOOL转换到bool的警告
vc中从BOOL型转换到bool型的时候,会出现警告,用static_cast是无效的,可以使用双否定(!!)来消除:
int *ip;
char *pc = (char*) ip;
效果与使用reinterpret_cast符号相同,但这种强制类型转换的可视性比较差,难以跟踪错误的转换。标准c++为了加强类型转换的可视,引入命名的强制转换操作符。
1.dynamic_cast
dynamic_cast支持运行时识别指针或引用的指向的对象。可以将基类类型对像的引用 或指针转换为同一继承层次中其他类型的引用或指针。dynamic_cast涉及运行时类型检查。如果绑定到引用 或指针的对像不是目标类型的对像,则dynamic_cast失败。因此,dynamic_cast一次执行两个操作,首先判断被请求的转换是否有效,只有转换有效,操作符才实际进行转换。
将基类引用 转换为派生类引用,这种dynamic_cast操作的形式如下:
dynamic_cast<Type& >(val)
2.const_cast
去掉变量的const属性,尽量少用。
3.static_cast
编译器隐匿执行的任何类型转换都可以由static_cast显式完成:
double d = 97.0;
char ch = static_cast<char>(d);
对于一个较大的算术类型到一个较小类型的赋值,编译器通常会产生警告。显式地提供强制类型转换时,警告信息就会被关闭。
如果编译器不提供自动转换,如使用static_cast找回存放在void*指针中的值:
void *p = &d;
double *dp = static_cast<double*>(p);
4.reinterpret_cast
reinterpret_cast通常为操作数的位模式提供较低层次重新解释,与旧式强制转换完全一样。这种类很不安全,尽量不用。
摘自c++primer。
PS:2012-04-19 消除从BOOL转换到bool的警告
vc中从BOOL型转换到bool型的时候,会出现警告,用static_cast是无效的,可以使用双否定(!!)来消除:
BOOL isRight = TRUE; bool b = !!isRright;
相关文章推荐
- reinterpret_cast,const_cast,static_cast,dynamic_cast 显式类型转换
- reinterpret_cast,const_cast,static_cast,dynamic_cast 显式类型转换
- C++ 学习笔记(4)表达式、运算符、类型转换(static_cast、const_cast、reinterpret_cast、dynamic_cast)
- 标准C++的类型转换:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- c++类型转换static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较,显示转换,隐式转换
- 数据类型转换(static_cast, const_cast ,reinterpret_cast ,dynamic_cast )
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast(转载)
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- 【转】标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast 收藏
- C++ 四种类型强制转换 static_cast、const_cast、reinterpret_cast、dynamic_cast
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast(转载)
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。
- C++中的类型转换(static_cast,dynamic_cast,const_cast,reinterpret_cast)
- C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast
- C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- c++中的类型转换(dynamic_cast, reinterpret_cast, static_cast ,const_cast)
- C++中的类型转换(static_cast、const_cast、dynamic_cast、reinterpret_cast)
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast