c++ 强制转换

C++强制转换总结

  1. c语言的强制类型转换,主要用于基础数据之间的转换
    语法规则:
    (type-id)expression //转换格式1
    type-id(expression) //转换格式2

  2. c++除了c语言的强制类型转换外,新增了四种强制类型转换:
    static_cast 、dynamic_cast、const_cast、reinterpret_cast
    语法为:
    static_cast<new_type> (expression)
    dynamic_cast <new_type> (expression)
    const_cast <new_type> (expression)
    reinterpret_cast <new_type> (expression)
    备注:new_type为目标数据类型,expression为原始数据类型变量或表达式

2.1 static_cast 主要有如下几种用法
a. 用于类层次结构中基类和派生类之间指针和引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
进行下行转换(把基类的指针或引用转换成派生类表示)
b. 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来验证。
c. 把空指针转换成目标类型的空指针
d. 把任何类型的表达式转换成void类型
注意:static_cast不能转换掉expression的const、volatile、或者_unaligned属性

### C++ 强制类型转换的使用方法和适用场景 在 C++ 中,强制类型转换通过四种显式类型转换关键字实现:`static_cast`、`dynamic_cast`、`const_cast` 和 `reinterpret_cast`。每种类型转换都有其特定的用途和安全性级别。 #### 1. `static_cast` `static_cast` 是一种静态类型转换,主要用于基本类型的转换以及明确的继承关系中的向上或向下转型。它的安全性较高,但需要开发者确保转换逻辑的正确性。 - **基本类型转换**: ```cpp double d = 3.14; int i = static_cast<int>(d); // 将 double 转换为 int ``` - **继承关系中的转换**: ```cpp class Base {}; class Derived : public Base {}; Derived derived; Base& baseRef = static_cast<Base&>(derived); // 向上转型 Derived& derivedRef = static_cast<Derived&>(baseRef); // 向下转型 ``` 上述代码中,`static_cast` 在明确的继承关系中可以安全地进行向上或向下转型[^1]。 #### 2. `dynamic_cast` `dynamic_cast` 主要用于多态类型的安全转换,通常涉及虚函数支持的类层次结构。它会在运行时检查类型的有效性,如果转换失败则返回空指针(针对指针)或抛出异常(针对引用)。 - **指针转换**: ```cpp class Base { virtual void foo() {} }; // 必须有虚函数 class Derived : public Base {}; Base* base = new Base(); Derived* derived = dynamic_cast<Derived*>(base); // 如果类型不匹配,返回 nullptr ``` - **引用转换**: ```cpp Base* base = new Derived(); try { Derived& derived = dynamic_cast<Derived&>(*base); // 如果类型不匹配,抛出 std::bad_cast } catch (std::bad_cast&) { // 处理异常 } ``` `dynamic_cast` 的安全性最高,但性能开销较大,因此建议仅在需要运行时类型检查时使用[^1]。 #### 3. `const_cast` `const_cast` 用于移除变量的 `const` 或 `volatile` 属性。它的主要用途是将常量对象临时转换为可变对象以调用非 `const` 成员函数。 ```cpp const int ci = 10; int* p = const_cast<int*>(&ci); // 移除 const 属性 *p = 20; // 修改值可能导致未定义行为 ``` 需要注意的是,修改通过 `const_cast` 转换后的对象可能会导致未定义行为,因此应谨慎使用[^1]。 #### 4. `reinterpret_cast` `reinterpret_cast` 是一种底层类型转换,通常用于将一个指针类型直接转换为另一个指针类型,或者将指针与整数之间进行转换。由于其操作完全依赖于编译器的具体实现,因此非常危险,应尽量避免使用。 ```cpp int i = 10; void* ptr = &i; int* intPtr = reinterpret_cast<int*>(ptr); // 指针类型转换 ``` ```cpp long address = reinterpret_cast<long>(&i); // 指针与整数之间的转换 ``` `reinterpret_cast` 通常用于系统调用或驱动开发等底层编程场景,但在普通应用开发中应尽量避免使用[^1]。 ### 总结 - `static_cast`:适用于基本类型转换和明确的继承关系转换。 - `dynamic_cast`:适用于多态类型的安全转换,需虚函数支持。 - `const_cast`:用于移除 `const` 或 `volatile` 属性。 - `reinterpret_cast`:用于底层系统编程,尽量避免使用。 #### 示例代码 ```cpp #include <iostream> using namespace std; class Base { virtual void foo() {} }; class Derived : public Base {}; int main() { double d = 3.14; int i = static_cast<int>(d); cout << "static_cast: " << i << endl; Base* base = new Derived(); Derived* derived = dynamic_cast<Derived*>(base); if (derived) { cout << "dynamic_cast succeeded" << endl; } const int ci = 10; int* p = const_cast<int*>(&ci); *p = 20; cout << "const_cast: " << ci << endl; long address = reinterpret_cast<long>(&ci); cout << "reinterpret_cast: " << hex << address << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值