学习记录 C++强制类型转换

在C++中,强制类型转换(type casting)是将一个数据类型的值转换为另一个数据类型的值。C++提供了几种不同的强制类型转换方式,每种方式都有其特定的用途和语法。以下是几种常见的强制类型转换方式:

1. C风格的强制类型转换
这种方式是C语言遗留下来的,语法简单,但不推荐在C++中使用,因为它不够安全和明确。

```cpp
int a = 10;
double b = (double)a; // C风格的强制类型转换
```

不够安全:C风格的强制类型转换不进行类型检查,可能导致运行时错误或未定义行为。例如,将一个不相关类型的指针转换为另一个类型的指针:

注意:显式类型转换不需要考虑级别问题,隐式类型转换必须小转大

  1. 布尔类型:

    • bool
  2. 字符类型:

    • char
    • signed char
    • unsigned char
    • wchar_t(宽字符类型)
    • char16_t(16位字符类型)
    • char32_t(32位字符类型)
  3. 整型:

    • short
    • unsigned short
    • int
    • unsigned int
    • long
    • unsigned long
    • long long
    • unsigned long long
  4. 浮点型:

    • float
    • double
    • long double

2. `static_cast`

`static_cast`用于基本数据类型之间的转换、指针和引用类型之间的转换、枚举类型和整数类型之间的转换,以及void*和其他指针类型之间的转换。
它在编译时进行检查,确保转换是安全的。

语法:static_cast<new_type>(expression)

```cpp
int a = 10;
double b = static_cast<double>(a); // 使用static_cast进行类型转换
```

基本数据类型之间的转换

int a = 10;
double b = static_cast<double>(a); // int 转换为 double
std::cout << "b: " << b << std::endl;

指针和引用类型之间的转换

class Base {
public:
    virtual void foo() {}
};

class Derived : public Base {
public:
    void foo() override {}
};

Base* basePtr = new Derived();
Derived* derivedPtr = static_cast<Derived*>(basePtr); // 基类指针转换为派生类指针
if (derivedPtr) {
    std::cout << "Conversion successful." << std::endl;
}

枚举类型和整数类型之间的转换

enum Color { RED, GREEN, BLUE };
Color color = RED;
int colorValue = static_cast<int>(color); // 枚举类型转换为整数类型
std::cout << "colorValue: " << colorValue << std::endl;

void指针和其他指针类型之间的转换

void* voidPtr = malloc(sizeof(int));
int* intPtr = static_cast<int*>(voidPtr); // void* 转换为 int*
*intPtr = 42;
std::cout << "*intPtr: " << *intPtr << std::endl;
free(voidPtr);

 3. `dynamic_cast`
`dynamic_cast`主要用于多态类型之间的转换,特别是将基类指针或引用转换为派生类指针或引用。它在运行时进行类型检查,如果转换失败会返回`nullptr`(对于指针)或抛出`std::bad_cast`异常(对于引用)。

```cpp
class Base {
    virtual void foo() {}
};

class Derived : public Base {
    void foo() override {}
};

Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); // 使用dynamic_cast进行类型转换
if (derivedPtr) {
    // 转换成功
} else {
    // 转换失败
}
```

4. `const_cast`
`const_cast`用于添加或移除`const`属性。它通常用于需要修改本应为常量的对象的情况。

```cpp
const int a = 10;
int* b = const_cast<int*>(&a); // 使用const_cast移除const属性
*b = 20;
```

5. `reinterpret_cast`
`reinterpret_cast`用于将一种类型的指针转换为另一种类型的指针,或者将一个整数转换为指针。它是最不安全的类型转换方式,因为它完全忽略了类型系统的检查。

```cpp
int a = 10;
void* ptr = reinterpret_cast<void*>(&a); // 使用reinterpret_cast进行类型转换
int* intPtr = reinterpret_cast<int*>(ptr);
```

### 总结
- **C风格的强制类型转换**:简单但不推荐。
- **`static_cast`**:用于相关类型之间的转换,编译时检查。
- **`dynamic_cast`**:用于多态类型之间的转换,运行时检查。
- **`const_cast`**:用于添加或移除`const`属性。
- **`reinterpret_cast`**:用于将一种类型的指针转换为另一种类型的指针,最不安全。

选择合适的强制类型转换方式可以提高代码的安全性和可读性。
 

  • 21
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值