博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C/CPP-类型转换

Posted on 2023-03-12 10:32  乔55  阅读(25)  评论(0编辑  收藏  举报

基本概念

// 发生隐式类型转换的情景
- 给无符号类型赋予一个超出其范围的初始值时,就会发生隐式类型转换

C语言强制类型转换


C++强制类型转换

// static_cast
1. 用于内置类型的转换,不可用于内置类型指针的转换:char* pc=static_cast<char*>(pi)
2. 可用于相关类型转换,如整型与实型之间的转换
    void test()
    {
        float f = 1.2;
        int i = static_cast<int>(f);
        cout << i << endl;
    }
3. 还可用于void*与其他类型指针之间(包括非内置类型指针)的转换
    void test()
    {
        int* p = static_cast<int*>(malloc(sizeof(int))); 
        cout << p << endl;   
    }
4.  子类转成父类类型:Parent p=static_cast<Parent>(c);  // 子类转父类,可;反之不可 




// dynamic_cast 
1. 主要用于类层次之间的转换:父类子类之间的转换,还可用于类之间的交叉转换
2. 具有类型检查功能,比static_cast更安全

// const_cast
1. 用于移除x的const属性。x必须是指针、引用、或指向某个对象类型成员的指针
2. 通常不是为了修饰对象,而为了给函数传参时函数可以接受该对象
3. const int& r1=10; int& r2=const_cast<int&>(r1); r2=20;  // 变成可修改的
    void show(int* p)
    {
        *p = 10;
    }
     
    void test()
    {
        const int a = 5;
        int* pa = const_cast<int*>(&a);
        show(pa);
        cout << "a=" << a << endl;        // 输出值为5,没有改变
        cout << "*pa=" << *pa << endl;    // 输出值为10
        cout << "&a=" << &a << endl;
        cout << "pa=" << pa << endl;
        // 明明&a与pa都表示同一地址,为什么2者指向的空间的数值却不一样
        // const_cast并没有真正改变const常量的值。
        // 猜测原因:*pa只是一个过渡值,并不是真正的a的值,暂存在register中,并未真正写入内存

        
        int& b = const_cast<int&>(a);
        b = 3;
        cout << a << endl;  // 输出值为5,没有改变
        cout << b << endl;  // 输出值为3
    }

// reinterpre_cast
1. 用于无关类型之间的转换,将内容重新解释为另一种不同的类型
2. 用于指针类型之间的转换、整数和指针类型的转换
3. 原理是直接从二进制位进行复制,但是是一种极其不安全的转换
4. 随便怎么转,编译器都不会报错,所以极其危险
- int* p=reinterpre_cast<int*>(pc);