C++ 类型强转
- static_cast- 基本概念
- static_cast主要用于在相关类型之间进行转换,这些类型之间存在某种隐式转换关系。它在编译时进行检查,是一种比较安全的类型转换方式。
 
- 适用场景
- 基本数据类型转换:例如将int转换为double,或者double转换为int(会截断小数部分)。int numInt = 5; double numDouble = static_cast<double>(numInt); int newNumInt = static_cast<int>(3.14);
- 类层次结构中的向上转换(将派生类指针或引用转换为基类指针或引用):假设存在基类Base和派生类Derived。class Base {}; class Derived : public Base {}; Derived d; Base* b = static_cast<Base*>(&d);
 
- 基本数据类型转换:例如将
 
- 基本概念
- dynamic_cast- 基本概念
- dynamic_cast主要用于在类的层次结构中进行安全的向下转换(将基类指针或引用转换为派生类指针或引用),它在运行时进行类型检查。
 
- 适用场景
- 当有一个基类指针指向一个派生类对象,想要将其转换回派生类指针时使用。如果转换成功,返回有效的派生类指针;如果转换失败(例如基类指针实际指向的不是目标派生类对象),则返回nullptr(对于指针类型)或者抛出std::bad_cast异常(对于引用类型)。class Base { virtual void f() {} }; class Derived : public Base {}; Base* b = new Derived(); Derived* d = dynamic_cast<Derived*>(b); if (d!= nullptr) { // 转换成功,可以安全使用d } else { // 转换失败 }
 
- 当有一个基类指针指向一个派生类对象,想要将其转换回派生类指针时使用。如果转换成功,返回有效的派生类指针;如果转换失败(例如基类指针实际指向的不是目标派生类对象),则返回
 
- 基本概念
- const_cast- 基本概念
- const_cast用于去除或添加- const或- volatile限定符。它主要用于在一些特定情况下修改原本被定义为- const的对象,但这种操作应该谨慎使用,因为修改- const对象可能会违反程序的逻辑和语义。
 
- 适用场景
- 当有一个const对象,但需要调用一个非const成员函数(该函数不会实际修改对象状态且这种操作是合理的情况下)。例如:class MyClass { public: void nonConstFunction() {} }; const MyClass myObj; // 以下代码通过const_cast将const对象转换为非const对象,以便调用nonConstFunction const_cast<MyClass&>(myObj).nonConstFunction();
 
- 当有一个
 
- 基本概念
- reinterpret_cast- 基本概念
- reinterpret_cast是一种比较危险的类型转换,它可以将一种类型的指针转换为另一种几乎完全不相关类型的指针,或者将一个整数转换为指针类型,反之亦然。这种转换不进行任何类型检查,几乎是对内存的重新解释。
 
- 适用场景
- 在一些与底层硬件交互或者特定的内存操作场景下可能会用到,但要非常小心。例如,将一个整数表示的内存地址转换为某种类型的指针(这种操作在某些特定的嵌入式系统或者内存管理代码中可能会出现)。int num = 0x12345678; // 将整数转换为字符指针(这是一种危险操作,仅用于示例) char* ptr = reinterpret_cast<char*>(&num);
 
- 在一些与底层硬件交互或者特定的内存操作场景下可能会用到,但要非常小心。例如,将一个整数表示的内存地址转换为某种类型的指针(这种操作在某些特定的嵌入式系统或者内存管理代码中可能会出现)。
 
- 基本概念
- C - style类型转换(旧的、不推荐的方式)
- 基本概念
- 在C++中仍然可以使用C - style类型转换,它的形式为(目标类型)表达式。这种转换方式不区分转换的类型,可能会隐藏一些潜在的错误。
 
- 在C++中仍然可以使用C - style类型转换,它的形式为
- 缺点
- 例如,(int)3.14这种转换,看起来很简单,但它没有像C++新的类型转换那样明确的语义区分,在复杂的代码中可能会导致难以发现的错误。而且它不像dynamic_cast那样在运行时进行类型检查,也不像static_cast那样在编译时进行严格的类型关系检查。
 
- 例如,
 
- 基本概念
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号