一、概述
C++ 提供了多种类型转换(Type Conversion)方式,以便在不同类型的数据之间进行转换。类型转换主要分为 隐式转换 和 显式转换(即强制转换)。其中,显式转换包括 C 风格转换、static_cast、dynamic_cast、const_cast 和 reinterpret_cast。
二、隐式类型转换(Implicit Conversion)
隐式转换是由编译器自动执行的类型转换,通常发生在以下几种情况:
- 基本类型转换:从低精度到高精度(如 int 转换为 double)。
- 算术转换:运算时,较低精度的类型会被转换为较高精度的类型(如 char 转换为 int)。
- 指针转换:int* 可以隐式转换为 void*,但 void* 不能隐式转换回 int*。派生类的指针可以隐式转换为基类指针(向上转型)。
- 布尔转换:非零整数转换为 true,零转换为 false。
- 非空指针转换为 true,空指针转换为 false。
示例:
int a = 10;
double b = a; // int 自动转换为 double
void* ptr;
int* pInt = &a;
ptr = pInt; // int* 隐式转换为 void*
三、显式类型转换(Explicit Conversion)
C++ 提供了多种强制转换方式,其中包括 C 风格转换和 C++ 提供的 static_cast、dynamic_cast、const_cast 和 reinterpret_cast。
C 语言中的类型转换使用 (type) 语法:
double d = 3.14;
int i = (int)d; // C 风格转换
C 风格转换的缺点:
- 不够安全,难以区分转换的类型。
- 可能会绕过 C++ 类型检查,导致潜在错误。
四、C++ 风格类型转换
1. static_cast
- 用途:用于相关类型之间的转换,如基本数据类型转换、类层次中的向上转换(派生类→基类指针/引用)、显式类型转换(无类型检查的向下转换)等。
- 语法:static_cast<