C++四大转换运算符

C语言类型转换直接(Type)方式进行转换,该类转换时, 代码的阅读性不高,不做安全性检查,const类型可以转非const,父类可以转为子类,转换时存在一定隐患。为此C++引入了四类类型转换运算符,分别如下:
1. dynamic_cast
    原型:dynamic_cast < type-id > ( expression )
    用于多态类型间的转换,转换时做运行期类型检查,转换时相对安全的,但是仅用于指针类型和引用类型。
    MSDN路径:https://docs.microsoft.com/en-us/cpp/cpp/dynamic-cast-operator?view=msvc-160


2. static_cast 
    原型:static_cast <type-id> ( expression )
    仅根据表达式中存在的类型,将表达式转换为类型id的类型。用于非多态性类型的转换。 一般用于数字类型之间的转换; 
    或者有集成关系的指针类型间的转换。
    此种类型转换不做运行时类型检查。dynamic_cast做检查;
    其不能转换含有const, volatile, or __unaligned 属性的变量
    MSDN路径:https://docs.microsoft.com/en-us/cpp/cpp/dynamic-cast-operator?view=msvc-160
    转换举例1:
    class B {};
    class D : public B {};

void f(B* pb, D* pd) {
   D* pd2 = static_cast<D*>(pb);   // Not safe, D can have fields
                                   // and methods that are not in B.

   B* pb2 = static_cast<B*>(pd);   // Safe conversion, D always
                                   // contains all of B.
}

    转换举例2:
    class B {
public:
   virtual void Test(){}
};
class D : public B {};

void f(B* pb) {
   D* pd1 = dynamic_cast<D*>(pb);
   D* pd2 = static_cast<D*>(pb);
}
    说明:如果pb == 0,以上转换返回相同结果为NULL,否则,pd1为NULL,pd2不为NULL
    
    转换举例3:
    typedef unsigned char BYTE;

void f() {
   char ch;
   int i = 65;
   float f = 2.5;
   double dbl;

   ch = static_cast<char>(i);   // int to char
   dbl = static_cast<double>(f);   // float to double
   i = static_cast<BYTE>(ch);
}
    
3. const_cast
    用于去掉const、volatile(易失的,易变的)和__unaligned属性。 
    MSDN路径:https://docs.microsoft.com/en-us/cpp/cpp/const-cast-operator?view=msvc-160
    
4. reinterpret_cast
    用于简单的重新解释比特位,用于相差较大类型之间的转换,例如:将一个字符串转为LPARAM消息参数
    reinterpret_cast<LPARAM>(L"类型强转")
    MSDN路径:https://docs.microsoft.com/en-us/cpp/cpp/reinterpret-cast-operator?view=msvc-160
    
关于const_cast和reinterpret_cast:
使用const_cast和reinterpret_cast作为最后的手段,因为这两个转换存在与老式转换相同的危险。然而,为了完全取代旧风格的造型,它们仍然是必要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值