C++的四种新式显示转换和一种旧式显示转换

C++的四种新式显示转换和一种旧式显示转换

1、静态转换(static_cast)

    static_cast包含的转换类型有典型的非强制变换、窄化(有信息丢失)变换、使用void*的强制转换、隐式类型

    变换、类层次的静态定位。static_cast是编译器允许的。

(1)典型的非强制变换

    从窄类型向宽类型的转换,如char向short int,int,long int,float,double,long double的转换。

char a = 1;
long b = static_cast<long>(a);

(2)窄化变换

    与第1种相反,从宽类型向窄类型的变换。

long b = 1;
char a = static_cast<char>(b);

(3)使用void*的强制变换

  任何非const型指针都可以赋予void*,void*被用于对象的确切类型未知或者特定环境下对象类型发生变化的情

  况下!void*不能直接被解除引用,因为没有类型信息可用来知道编译器怎么解释低层位模板!void*必须转换

  成某类型的指针,C++中没有void*到特殊类型的自动转换!必须显示强制转换!

struct callback_param
{
    void *vp;
};
int a = 1;
struct callback_param cp;
cp.vp = &a;      //编译器允许从任意类型指针向void*转换
int *ip = static_cast<int *>(cp.vp);

(4)隐式类型转换

    包括(1)(2)

(5)类层次的静态定位

    进行向上类型转换(派生类向基类转换)时,编译器清楚派生自什么祖先类,除了多继承(多继承转换后可能不为

    原地址,指针会在类层次中调整)。


2、常量转换(const_cast)

    从const转换为非const,从volatile转换为非volatile。取得const对象的地址,会生成一个指向const的指针,

    volatile同。 

const int i = 0;
int *ip = const_cast<int *>(&i);
volatile int a = 0;
int *ap = const_cast<int *>(&a);


3、重解释转换(reinterpret_cast)

    最不安全的一种转换机制,将对象转变为完全不同类型的对象,这是低级的位操作。

struct msg_hdr
{
    int msg_type;
    int msg_len;
    char msg_data[0];
};
 
struct msg_data
{
    int data1;
    int data2;
};
 
struct msg_hdr *p = reinterpret_cast<struct msg_hdr *>(recvbuf);
struct msg_data *pdata = reinterpret_cast<struct msg_data *>(p->msg_data);


4、动态转换(dynamic_cast)

    类层次的向下转换(基类向派生类转换),转换过程中会通过RTTI检查转换类型是否正常,不正常将返回空。

#include <iostream>
using namespace std;
class pet{    
public:    
    virtual ~pet()    
    {    
}};

class dog : public pet{};

class cat : public pet{};

int main(void){    
    pet *b = new cat;    
    dog *d1 = dynamic_cast<dog *>(b);    
    cat *d2 = dynamic_cast<cat *>(b);    
    cout << "d1 = " << (long)d1 << endl;  // d1 = 0    
    cout << "d2 = " << (long)d2 << endl;
}


5旧式强制类型转换

  旧式强制类型可以用来替代上面的C++中新式强制类型转换,对旧式强制类型转换的支持,是为了保持向后

  兼容性,以及提供与C语言兼容的符号!

  格式:(expr) type  例如:

Const char* a = (const char*)b;
int* b        = (int*)d;



转载于:https://my.oschina.net/Ccx371161810/blog/294252

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值