C++ 允许我们将一种类型的数据转换为另一种类型。这被称为类型转换。
C++ 中有两种类型的类型转换:
- 隐式转换
- 显式转换 (也称为类型转换)
隐式类型转换
由编译器自动完成的类型转换称为隐式类型转换。这类转换也称为自动转换。
示例 1:int 到 double 的转换
// Working of implicit type-conversion
#include <iostream>
using namespace std;
int main() {
// assigning an int value to num_int
int num_int = 9;
// declaring a double type variable
double num_double;
// implicit conversion
// assigning int value to a double variable
num_double = num_int;
cout << "num_int = " << num_int << endl;
cout << "num_double = " << num_double << endl;
return 0;
}
输出
num_int = 9 num_double = 9
在该程序中,我们将 int
数据分配给了一个 double
变量。
num_double = num_int;
在这里,在将 int
值分配给 num_double 变量之前,它会被编译器自动转换为 double
。这是一个隐式类型转换的例子。
示例 2:double 到 int 的自动转换
#include <iostream>
using namespace std;
int main() {
int num_int;
double num_double = 9.99;
// implicit conversion
// assigning a double value to an int variable
num_int = num_double;
cout << "num_int = " << num_int << endl;
cout << "num_double = " << num_double << endl;
return 0;
}
输出
num_int = 9 num_double = 9.99
在该程序中,我们将 double
数据分配给了一个 int
变量。
num_int = num_double;
在这里,在将 double
值分配给 num_int 变量之前,它会被编译器自动转换为 int
。这也是一个隐式类型转换的例子。
注意:由于 int
不能有小数部分,因此在上面的示例中,小数部分会被截断。
转换过程中的数据丢失 (收窄转换)
正如我们在上面的示例中所看到的,从一种 数据类型 转换为另一种数据类型容易导致数据丢失。当较大类型的数据转换为较小类型的数据时,就会发生这种情况。
让我们看看在整数数据类型中进行类型转换时的数据丢失。

现在,让我们看看在浮点数据类型中进行类型转换时的数据丢失。

注意:在整数和浮点数据类型之间进行转换时可能会发生数据丢失。
C++ 显式转换
当程序员手动将数据从一种类型更改为另一种类型时,这被称为显式转换。这类转换也称为类型转换。
在 C++ 中,我们可以通过三种主要方式使用显式转换:
- C++ 命名转换
- C 风格类型转换 (也称为转换表示法)
- 函数表示法 (也称为旧 C++ 风格类型转换)
警告:在现代 C++ 代码中不应使用 C 风格和函数风格的转换。
C++ 命名转换
C++ 有四个用于显式类型转换的表达式。它们被称为C++ 命名转换。它们是:
static_cast
dynamic_cast
const_cast
reinterpret_cast
要了解每个运算符,请访问 C++ 命名转换。
C 风格类型转换
顾名思义,这种类型的转换是C 编程语言所青睐的。它也称为转换表示法。
语法
(data_type)expression;
例如,
// initializing int variable
int num_int = 26;
// declaring double variable
double num_double;
// converting from int to double
num_double = (double)num_int;
函数风格转换
我们也可以使用类似函数的表示法将数据从一种类型转换为另一种类型。
语法
data_type(expression);
例如,
// initializing int variable
int num_int = 26;
// declaring double variable
double num_double;
// converting from int to double
num_double = double(num_int);
示例 3:类型转换
#include <iostream>
using namespace std;
int main() {
// initializing a double variable
double num_double = 3.56;
cout << "num_double = " << num_double << endl;
// C-style conversion from double to int
int num_int1 = (int)num_double;
cout << "num_int1 = " << num_int1 << endl;
// function-style conversion from double to int
int num_int2 = int(num_double);
cout << "num_int2 = " << num_int2 << endl;
return 0;
}
输出
num_double = 3.56 num_int1 = 3 num_int2 = 3
我们使用了C 风格类型转换和函数风格的类型转换,并显示了结果。由于它们执行相同的任务,因此两者都给我们相同的输出。
在现代 C++ 代码中应避免使用 C 风格和函数风格的转换。
这些转换方法被认为不安全,因为它们不像 C++ 的命名转换表达式那样提供类型检查和约束。
这种不安全性可能导致您的程序中难以发现的错误和未定义行为。相反,建议使用 C++ 命名转换,它们为类型转换提供了更具体、更安全的选择。
另请阅读