• C++程序员修炼手册--成员类型转换


    目录

    一,static_cast

    二,reinterpret_cast

    三,const_cast

    四,dynamic_cast

    五,总结


    一,static_cast

    static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可static_cast,但它不能用于两个不相关的类型进行转换

    1. #include<iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. //int 转double
    6. int a=10;
    7. double b=static_cast<double>(a);
    8. cout<<b<<endl;
    9. //double转int
    10. double c=12.34;
    11. int d=static_cast<int>(c);
    12. cout<<d<<endl;
    13. //short转int
    14. short ss=11.22;
    15. int re=static_cast<int>(ss);
    16. cout<<re<<endl;
    17. //short转double
    18. short ss1=11.22;
    19. double dd=static_cast<double>(ss1);
    20. cout<<dd<<endl;
    21. return 0;
    22. }

    二,reinterpret_cast

    reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。

    就是无关类型的转换。

    1. typedef void(*FUNC)();
    2. int DoSomething(int i)
    3. {
    4. cout << "DoSomething:" << i <<endl;
    5. return 0;
    6. }
    7. void Test()
    8. {
    9. //
    10. // reinterpret_cast可以编译器以FUNC的定义方式去看待DoSomething函数
    11. // 所以非常的BUG,下面转换函数指针的代码是不可移植的,所以不建议这样用
    12. // C++不保证所有的函数指针都被一样的使用,所以这样用有时会产生不确定的结果
    13. //
    14. FUNC f = reinterpret_cast<FUNC>(DoSomething);
    15. f();
    16. }

    三,const_cast

    取消变量的const属性,方便赋值操作。

    1. void const_test()
    2. {
    3. const int a=10;
    4. int *p=const_cast<int*>(&a);
    5. *p=20;
    6. cout<<a<<endl;
    7. cout<<*p<<endl;
    8. }

    但是输出是会发现一个10,一个20,此时就牵扯到一个编译器的优化问题,打开内存就可以看到两个值都改变了,但是经过编译器的优化,只会输出10,20;

    四,dynamic_cast

    dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

    向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)

    向下转型:父类对象指针/引用- >子类指针/引用(用dynamic_cast转型是安全的)

    注意: 1. dynamic_cast只能用于含有虚函数的类 2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

    1. class A
    2. {
    3. public:
    4. virtual void f(){}
    5. int _a;
    6. };
    7. class B : public A
    8. {
    9. public:
    10. int _b;
    11. };
    12. // 父类A指针,我想把A转成子类B的指针 -- 向下转
    13. void fun(A* pa)
    14. {
    15. // 不安全的
    16. B* pb1 = (B*)pa;
    17. //pb1->_b = 10;
    18. // dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr
    19. B* pb2 = dynamic_cast<B*>(pa); // 安全的
    20. if (pb2)
    21. {
    22. pb1->_b = 10;
    23. }
    24. cout << "pb1:" << pb1 << endl;
    25. cout << "pb2:" << pb2 << endl;
    26. }
    27. int main()
    28. {
    29. A a;
    30. B b;
    31. //fun(&a);
    32. fun(&b);
    33. return 0;
    34. }

    五,总结

    1,static_cast:相似成员的类型转换

    2,reinterpret_cast:不相关类型的转换

    3,const_cast:取消成员的const属性

    4,dynamic_cast:子类向父类转换,父类向子类转换,适用于含有虚函数的类中。

    5,explicit:阻止隐士类型的转换

  • 相关阅读:
    Python爬虫——Requests 的Get和Post请求
    JAVA Swing + Jdbc 实现宿舍管理系统
    Java:本地文件通过表单参数接口发送后大小变成0
    v.$message不弹框的问题
    Java编程--单例模式(饿汉模式/懒汉模式)/阻塞队列
    数据结构——排序
    熵增定律与软件的熵
    电源控制系统架构(PCSA)电源控制挑战
    F#奇妙游(32):缺失数据集合的处理
    牛客前端八股文(每日更新)
  • 原文地址:https://blog.csdn.net/m0_63111921/article/details/125425677