C++ 类型转换

C++ 允许我们将一种类型的数据转换为另一种类型。这被称为类型转换。

C++ 中有两种类型的类型转换:

  1. 隐式转换
  2. 显式转换 (也称为类型转换)

隐式类型转换

由编译器自动完成的类型转换称为隐式类型转换。这类转换也称为自动转换。


示例 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 不能有小数部分,因此在上面的示例中,小数部分会被截断。


转换过程中的数据丢失 (收窄转换)

正如我们在上面的示例中所看到的,从一种 数据类型 转换为另一种数据类型容易导致数据丢失。当较大类型的数据转换为较小类型的数据时,就会发生这种情况。

让我们看看在整数数据类型中进行类型转换时的数据丢失。

Possible Data Loss During Type Conversion in Integer Data Type
整数数据类型中类型转换可能导致的数据丢失

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

Possible Data Loss During Type Conversion in Floating Point Data Type
浮点数据类型中类型转换可能导致的数据丢失

注意:在整数和浮点数据类型之间进行转换时可能会发生数据丢失。


C++ 显式转换

当程序员手动将数据从一种类型更改为另一种类型时,这被称为显式转换。这类转换也称为类型转换

在 C++ 中,我们可以通过三种主要方式使用显式转换:

  1. C++ 命名转换
  2. C 风格类型转换 (也称为转换表示法)
  3. 函数表示法 (也称为旧 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++ 的命名转换表达式那样提供类型检查和约束。

这种不安全性可能导致您的程序中难以发现的错误和未定义行为。相反,建议使用 C++ 命名转换,它们为类型转换提供了更具体、更安全的选择。


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战