Tutorial Study Image

C++ 类型转换


2022年8月7日, Learn eTutorial
2169

在本教程中,我们将探讨如何在 C++ 编程语言中将一种数据类型转换为另一种数据类型。类型转换是将一个变量的预定义数据类型转换为适当的数据类型。类型转换的基本思想是将两个不同的数据类型变量转换为单一数据类型,以便在不丢失数据的情况下快速解决数学和逻辑表达式。

例如,如果我们相加两个数字,其中一个变量是 int 类型,另一个是 float 类型,则必须将 int 变量转换为 float 才能相加。  

C++ 使我们能够将数据从一种类型转换为另一种类型。这称为类型转换。

C++ 中主要有两种类型的类型转换。

  • 隐式类型转换
  • 显式类型转换

在 C++ 中,类型转换主要可以通过两种方式实现:隐式类型转换和显式类型转换。隐式类型转换,也称为自动类型转换,由编译器自身执行。显式或用户定义的类型转换是由用户执行或需要用户干预的转换。现在让我们详细了解 C++ 中的隐式和显式类型转换。

隐式类型转换

编译器会自动执行隐式类型转换,无需人工干预。这意味着隐式转换会根据某些预定义的 C++ 编译器规则自动将一种数据类型转换为另一种数据类型。因此,它也称为自动类型转换。

例如,


int x = 50;  
short int y = 5;  
int z = x + y;  
 

在上面的示例中,有两个不同数据类型的变量 x 和 y,其中 x 是 int,y 是 short int。结果变量 z 也属于整数类型,它将存储 x 和 y 变量。但是,在计算两个数字的和之前,C++ 编译器会将较低级别的 int 数据类型(short int)值转换为更高级别的数据类型(int)。因此,它避免了 C++ 隐式类型转换中的数据丢失、溢出以及符号丢失。

Implicit Type Conversion

示例 1:让我们编写一个程序,使用隐式类型转换将 int 转换为 double

隐式类型转换程序


#include <iostream>
using namespace std;

int main() {
   // here we are assigning an int value to num_int
   int num_int = 7;

   // declaring a double type variable
   double num_double;
 
   // implicit conversion
   //  int value to a double variable is assigned
   num_double = num_int;

   cout << "num_int = " << num_int << endl;
   cout << "num_double = " << num_double << endl;

   return 0;
}

输出


num_int = 7
num_double = 7

我们在上面的程序中将 int 数据分配给了 double 变量。


num_double = num_int;

在这里,在示例 1 中,编译器在将 int 值分配给 num_double 变量之前会自动将其转换为 double。这是隐式类型转换的一个例子。

示例 2:让我们编写一个程序,使用隐式类型转换将 double 自动转换为 int。

隐式类型转换程序


#include <iostream>
using namespace std;

int main() {

   int num_int;
   double num_double = 8.88;

   // 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 = 8
num_double = 8.88

我们在上面的程序中将 double 数据分配给了 int 变量。


num_int = num_double;

在将 double 值分配给 num int 变量之前,编译器会自动将其转换为 int。这也可以说是隐式类型转换的一个很好的例子。

由于 int 不能有小数部分,因此上面的示例中小数点后的数字被截断了。

转换期间如何发生数据丢失?

正如我们在前面的示例中看到的,将一种数据类型转换为另一种数据类型容易发生数据丢失。这主要发生在将较大的数据类型转换为较小的数据类型时。

Implicit Type Conversion

转换期间发生数据丢失

此图显示了类型转换期间发生的数据丢失。

显式类型转换

显式类型转换是指需要用户干预才能将一个变量的数据类型更改为另一个变量的转换。换句话说,显式转换允许程序员更改或类型转换一个变量的数据类型为另一种。因此,它也称为类型转换。为了将数据从一种类型转换为另一种类型,我们通常会强制执行显式类型转换,因为它不遵循隐式转换规则。

在 C++ 中,我们可以通过三种不同的方式使用显式转换,它们是:

  1. C 风格类型转换 
  2. 函数符号/函数风格转换
  3. 类型转换运算符

1.    C 风格类型转换 

顾名思义,C 编程语言偏爱这种风格的转换。它也称为强制转换符号。

语法


(data_type)expression;
 

例如


// initializing int variable
int num_int = 36;

// declaring double variable
double num_double;

// here converting from int to double is done
num_double = (double)num_int;
 

1.    函数风格转换 

也可以使用类似函数的符号将数据从一种类型转换为另一种类型。

语法


(data_type)expression;
 

例如


// initializing int variable
int num_int = 36;

// declaring double variable
double num_double;

// converting from int to double
num_double = double(num_int);
 

示例 3:C++ 中类型转换的示例程序


#include <iostream>

using namespace std;

int main() {
    // initializing a double variable
    double num_double = 4.67;
    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 = 4.67
num_int1   = 4
num_int2   = 4

上面的示例展示了使用 C 风格类型转换和函数风格转换的类型转换结果。它们都产生相同的结果,因为它们执行相同的任务。

3. 类型转换运算符

除了这两种类型转换之外,C++ 还有四种用于类型转换的运算符。它们主要被称为类型转换运算符。

  1. static_cast
  2. dynamic_cast
  3. const_cast
  4. reinterpret_cast

类型转换运算符将在下一个教程中详细解释(链接)。

类型转换的好处 

  • 可以实现数据类型层次结构的功能。
  • 它对于计算具有不同数据类型变量的表达式很有用。
  • 它非常方便

类型转换的缺点

  • 类型转换使系统变得更加复杂。
  • 意外的类型转换可能导致错误。
  • 可以从对象直接访问类型。