• C++ 四种类型转换的介绍


    C++标准有四种类型转换,分别是const_cast、static_cast、dynamic_cast和reinterpret_cast

    需要提醒大家的是:带有转型的设计大部分都是不好的,所以在需要用转型的时候大家可以考虑下尽量采用不转型的方法来替代!

    1、const_cast

    去掉类型的const属性,这个应该很好理解,只有这个转型能把const属性去掉

    比如:

    Base a;
    const Base& refA = a;
    const_cast<Base&>(refA).DoSomething(); // DoSomething为非const成员函数,需去掉const属性调用

    2、static_cast、dynamic_cast

    这两个转型放在一起介绍,因为在某些情况两个转型可以通用,

    static_cast的主要用途:

    • 用于基本数据类型的转换,如short、int、double、float、bool、char、枚举等类型的转换
    • void*和任何类型的指针的互相转换,在多线程参数的传递经常用到的
    • 非const对象转换为const对象

    static_cast和dynamic_cast区别:

    • static_cast:非指针或者引用对象,static_cast可将派生类转换为基类,不能将基类转换为派生类,指针或者引用可以用static_cast将基类转为派生类
    • dynamic_cast:基类与派生类互相转换,但是只能用于指针或者引用对象

    注意:用dynamic_cast必要要求基类有虚函数,static_cast无此限制,对于指针或者引用,基类转换为派生类最好用dynamic_cast,dynamic_cast比较安全,转换失败会得到NULL,不会出现不安全的指针,但是dynamic_cast速度慢,如果在性能敏感的程序中,在大量循环中可以考虑用static_cast代替dynamic_cast,但是最好确保基类是指向派生类的指针,可以自己权衡利弊做决定使用哪个!

    Derive d;
    Base b;
    Base *pB = &b;
    Derive *pDeriveD = dynamic_cast<Derive*>(pB); // pDeriveD为NULL
    Derive *pStaticCastD = static_cast<Derive*>(pB); // pStaticCastD是不安全的

    3、reinterpret_cast

    reinterpret_cast意图执行低级转型,只能用于指针或者引用,且理论上可以用于任何指针类型的转换,且不可移植

    比如char* pStr存储了unicode编码的字符串,可以reinterpret_cast<wchar_t*>(pStr)将char*转换为wchar_t*,其实也可用reinterpret_cast将基类和派生类相互转换,但此时和static_cast一样,不保证安全性

  • 相关阅读:
    题解 nflsoj204 排列
    题解 CF1328 D,E,F Carousel, Tree Queries, Make k Equal
    题解 LOJ3277 「JOISC 2020 Day3」星座 3
    题解 nflsoj464 CF1267K 正睿1225:一个简单的计数技巧
    题解 CF1326F2 Wise Men (Hard Version)
    题解 CF1326E Bombs
    题解 CF1316E and UOJ495:一类结合贪心的背包问题
    仓鼠的DP课 学习笔记
    题解 CF1314B Double Elimination
    固件
  • 原文地址:https://www.cnblogs.com/hui277/p/3527081.html
Copyright © 2020-2023  润新知