c++笔记 显式类型转换static_cast、dynamic_cast、const_cast、reinterpret_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;





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
reinterpret_cast和reinterpret_pointer_cast都是C++中的类型转换操作符。引用中提到,reinterpret_pointer_cast的功能与reinterpret_cast类似,都是用于进行指针类型之间的转换。而引用中列举了C++中的几种智能指针转换方式,其中包括reinterpret_pointer_cast。 reinterpret_cast用于在不同类型之间进行强制转换,包括指针类型、引用类型、整数类型等。它可以将一个指针类型转换为另一个指针类型,但是要注意使用reinterpret_cast进行类型转换时,转换的类型之间必须具有相同的存储要求。 reinterpret_pointer_cast是C++中的智能指针类型转换操作符,用于将一个智能指针类型转换为另一个智能指针类型。它的功能与reinterpret_cast类似,但是它只能用于智能指针类型之间的转换。 总结起来,reinterpret_cast用于进行任意类型之间的强制转换,而reinterpret_pointer_cast则是用于智能指针类型之间的转换。它们的使用要慎重,因为错误的类型转换可能会导致程序运行出错。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [static_pointer_cast、dynamic_pointer_cast、const_pointer_cast、reinterpret_pointer_cast](https://blog.csdn.net/sunlin972913894/article/details/108427587)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [C/C++ static_cast、dynamic_cast、const_cast、reinterpret_cast 笔记整理](https://blog.csdn.net/anwh9295/article/details/124357525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值