标准c++中主要有四种强制转换类型运算符

本文详细介绍了C++中的四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast的功能与使用方法,并通过实例说明了它们在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先声明是从别人那里转来的,原文地址:http://www.doserver.net/read.php?520

 

  1. 标准c++中主要有四种强制转换类型运算符: 
  2.  
  3. const_castreinterpret_caststatic_castdynamic_cast等等。 
  4.  
  5.  
  6.  
  7.  
  8. 1)static_cast<T*>(a) 
  9.  
  10. 将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。 
  11.  
  12. 表达式static_cast<T*>(a), a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。 
  13.  
  14.  
  15.  
  16.  
  17. 例子: 
  18.  
  19.  
  20.  
  21.  
  22. class B { ... }; 
  23.  
  24. class D : public B { ... }; 
  25.  
  26. void f(B* pb, D* pd) 
  27.  
  28.  
  29.    D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指针 
  30.  
  31.  
  32.  
  33.  
  34.    B* pb2 = static_cast<B*>(pd);        // 安全的 
  35.  
  36.    ... 
  37.  
  38.    
  39.  
  40. 2)dynamic_cast<T*>(a) 
  41.  
  42. 完成类层次结构中的提升。T必须是一个指针、引用或无类型的指针。a必须是决定一个指针或引用的表达式。 
  43.  
  44. 表达式dynamic_cast<T*>(a) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针。 
  45.  
  46.  
  47.  
  48.  
  49. 例子: 
  50.  
  51. class A { ... }; 
  52.  
  53. class B { ... }; 
  54.  
  55. void f() 
  56.  
  57.  
  58.   A* pa = new A; 
  59.  
  60.   B* pb = new B; 
  61.  
  62.   void* pv = dynamic_cast<A*>(pa); 
  63.  
  64.   // pv 现在指向了一个类型为A的对象 
  65.  
  66.   ... 
  67.  
  68.   pv = dynamic_cast<B*>(pb); 
  69.  
  70.   // pv 现在指向了一个类型为B的对象 
  71.  
  72.  
  73.  
  74.  
  75.  
  76. 3)const_cast<T*>(a) 
  77.  
  78. 去掉类型中的常量,除了const或不稳定的变址数,T和a必须是相同的类型。 
  79.  
  80. 表达式const_cast<T*>(a)被用于从一个类中去除以下这些属性:const, volatile, 和 __unaligned。 
  81.  
  82.  
  83.  
  84.  
  85. 例子: 
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93. class A { ... }; 
  94.  
  95. void f() 
  96.  
  97.  
  98.  const A *pa = new A;//const对象 
  99.  
  100. A *pb;//非const对象 
  101.  
  102.  
  103.  
  104.  
  105. //pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象 
  106.  
  107. pb = const_cast<A*>(pa); // 现在OK了 
  108.  
  109. ... 
  110.  
  111.  
  112.  
  113.  
  114.  
  115. 4)reinterpret_cast<T*>(a) 
  116.  
  117. 任何指针都可以转换成其它类型的指针,T必须是一个指针、引用、算术类型、指向函数的指针或指向一个类成员的指针。 
  118.  
  119. 表达式reinterpret_cast<T*>(a)能够用于诸如char* 到 int*,或者One_class* 到 Unrelated_class*等类似这样的转换,因此可能是不安全的。 
  120.  
  121.  
  122.  
  123.  
  124. 例子: 
  125.  
  126. class A { ... }; 
  127.  
  128. class B { ... }; 
  129.  
  130. void f() 
  131.  
  132.  
  133.   A* pa = new A; 
  134.  
  135.   void* pv = reinterpret_cast<A*>(pa); 
  136.  
  137.   // pv 现在指向了一个类型为B的对象,这可能是不安全的 
  138.  
  139.   ... 
  140.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值