C++中提供的类型转换方式




C++中提供了以下几种类型转换运算符


•static_cast<类型>()
–转换时做静态检查,即在编译时进行
–void*到其他指针的转换

•reinterprect_cast<类型>()
–允许强转任何类型的指针
–把整数强转成指针,指针强转成整数

•const_cast<类型>()
–去掉cv限制

•dynamic_case<类型>()  
–动态转换




以下是详细代码:


/


//类型转换


#include <iostream>
using namespace std;


int main(){
    //
    double pi = 3.1415926;
    cout << "要转的内容 " << pi << endl;
    //强转
    int x = pi;
    cout << "强转 " << x << endl;
    
    
    //C++提供的转换方式
    
    
    cout << "========== 法一 static_cast  ===========" << endl << endl << endl;
    /*
     *
     *
     *
     static_cast<类型>()
     转换时做静态检查,即在编译时进行
     void*到其他指针的转换
     
     *
     *
     *
     */
    
    //                要转的类型  要转的内容
    int y = static_cast<int>(pi);
    cout << "C++提供的转换方式 " <<y << endl;
    
    
    // void*  可以指向任意类型
    void* pc = new long(12345);
    
    long* pl = static_cast<long*>(pc);
    cout << "任意类型本指向long类型的 现在也可以转成long* :" << *pl << endl<< endl << endl;
    
    //long类型的指针 转换成 double类型的指针  不合理
    //double *pdd = pc;//强转都不行
    //static_cast 转换会做类型检查 合理就转,否则会拒绝操作
   // double* pd = static_cast<double*>(pl);
    
    
    cout << "========== 法二 reinterpret_cast ===========" << endl << endl;
    
    
    /*
     *
     *
     *
     
     reinterprect_cast<类型>()
     允许强转任何类型的指针
     把整数强转成指针,指针强转成整数
     
     比较强悍,你想转它就帮你转,但是不对结果负责
     
     *
     *
     *
     */
    
    double* pd = reinterpret_cast<double*>(pl);
    
    cout << "reinterprect_cast转换前:" << *pl << endl;
    cout << "reinterprect把long类型强转成double指针后:" << *pd << endl << endl;
    
    
    
    
    cout << "========== 法三 const_cast ===========" << endl << endl;
    /*   
     *
     *
     *
     
     法三
     
     const_cast<类型>()
     去掉 c      v 限制
         const  volatile
     *
     *
     *
     */
    
    //编辑器在这里发现 a 是const类型,它就认为 a 不可修改,所以在下面只要出现 a 它都会去用 200 来替换
    //volatile 告诉编译器该 const 类型变量,有可能进行修改,在使用时去内存中查找真实数据
    
    
    volatile const int a = 100;
    //a++;//这样的a修改不了 因为类型不允许
    //(但是其实取到内存还是可以修改的)
    
    //&a 类型是const int*
    // int* pa = &a; //取a的地址
    //const int* pa = &a;//const修饰指针 说明指针指向的那块空间不能改 ???
    //*pa = 200;//这样不行 是因为pa指针是用const修饰的了
    

    
    //去掉const
    int* pa = const_cast<int*>(&a);
    
    *pa = 300;
    cout << "const_cast去掉cv限制: a = " << a << endl;//在这里打印的时候还是100貌似没改变  实际上是编译器一开始看到a是const所以它自以为a是不能变的,在接下来用到a的地方都把100替换     我们应该告诉编译器去地址里面取值
    

  
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值