C++ 类型转换
本节将讨论C++编程语言中变量的类型转换。类型转换是指程序中将一个数据类型转换为另一个数据类型的过程。类型转换可以通过编译器自动完成,也可以由程序员或用户手动实现。类型转换也被称为类型转换。
示例,假设给定的数据是整数类型,我们想将其转换为浮点类型。因此,我们需要手动将int数据转换为float类型,这种类型的转换在C++中称为类型转换。
int num = 5;
float x;
x = float(num);
x = 5.0
**2 nd 例子: **
float num = 5.25;
int x;
x = int(num);
Output: 5
类型转换分为两种类型:隐式转换或隐式类型转换和显式转换或显式类型转换。
隐式类型转换
- 它被称为自动类型转换。
- 它自动从一种数据类型转换到另一种,无需程序员或用户进行任何外部干预。 这意味着编译器会自动将一种数据类型转换为另一种。
- 所有数据类型都会自动升级到最大的类型,而不会丢失任何信息。
- 它只能在程序中应用,前提是两个变量彼此兼容。
char - sort int -> int -> unsigned int -> long int -> float -> double -> long double, etc.
注意:隐式类型转换应该从低到高的数据类型进行。否则,会影响基本数据类型,可能会丢失精度或数据,并且编译器可能会显示警告。
在C++中使用隐式类型转换的程序
让我们创建一个例子来演示在C++中使用隐式类型转换将一个变量转换为另一个变量。
#include
using namespace std;
int main ()
{
short x = 200;
int y;
y = x;
cout << " Implicit Type Casting " << endl;
cout << " The value of x: " << x << endl;
cout << " The value of y: " << y << endl;
int num = 20;
char ch = 'a';
int res = 20 + 'a';
cout << " Type casting char to int data type ('a' to 20): " << res << endl;
float val = num + 'A';
cout << " Type casting from int data to float type: " << val << endl;
return 0;
}
输出:
Implicit Type Casting
The value of x: 200
The value of y: 200
Type casting char to int data type ('a' to 20): 117
Type casting from int data to float type: 85
在上面的程序中,我们声明了一个short数据类型变量x为200和一个整数变量y。之后,我们将x的值赋给了y,编译器会自动将short数据值x转换为y,返回值y为200。
在下面的表达式中,我们声明了一个int类型的变量num为20,和一个字符类型的变量ch为’a’,它等同于一个整数值97。然后,我们将这两个变量相加进行隐式转换,表达式的结果为117。
类似地,在第三个表达式中,我们将整数变量num为20和字符变量ch为65相加,然后将结果赋给了浮点型变量val。因此,编译器会自动将表达式的结果转换为浮点型。
显式类型转换或显式类型转换
- 也被称为程序中的手动类型转换。
- 由程序员或用户手动进行转换,从一个数据类型转换为另一个数据类型。这意味着用户可以根据程序的要求轻松将一个数据类型转换为另一个数据类型。
- 不需要检查变量的兼容性。
- 在此转换中,我们可以在程序中将一个变量的数据类型升级或降级为另一个变量的数据类型。
- 使用cast()运算符来更改变量的类型。
显式类型转换的语法
(type) expression;
类型: 表示将给定表达式转换为用户定义的数据类型。
表达式: 表示常量值、变量或数据类型被转换的表达式。
示例,我们有一个浮点数为4.534,想将其转换为整数值,代码如下:
int num;
num = (int) 4.534; // cast into int data type
cout << num;
当执行上面的语句时,浮点值将使用cast()运算符强制转换为整数数据类型。浮点值赋给整数num,截断小数部分并将4显示为整数值。
在C++中演示显式类型转换的程序
让我们创建一个简单的程序,使用C++编程语言中的显式类型转换将一个类型变量转换为另一个类型。
#include
using namespace std;
int main ()
{
// declaration of the variables
int a, b;
float res;
a = 21;
b = 5;
cout << " Implicit Type Casting: " << endl;
cout << " Result: " << a / b << endl; // it loses some information
cout << " \n Explicit Type Casting: " << endl;
// use cast () operator to convert int data to float
res = (float) 21 / 5;
cout << " The value of float variable (res): " << res << endl;
return 0;
}
输出:
Implicit Type Casting:
Result: 4
Explicit Type Casting:
The value of float variable (res): 4.2
在上面的程序中,我们使用两个整数变量a和b,它们的值分别为21和2。然后,我们将a除以b(21/2),得到一个int类型的值4。
在第二个表达式中,我们声明了一个float类型的变量res,它使用强制类型转换方法中的类型转换运算符来存储a和b的结果,不丢失任何数据。
使用强制类型转换运算符将double数据转换为int和float类型的程序
让我们举一个例子,使用C++编程将double数据转换为float和int类型,计算矩形的面积。
#include
using namespace std;
int main ()
{
// declaration of the variables
double l, b;
int area;
// convert double data type to int type
cout << " The length of the rectangle is: " << endl;
cin >> l;
cout << " The breadth of the rectangle is: " << endl;
cin >> b;
area = (int) l * b; // cast into int type
cout << " The area of the rectangle is: " << area << endl;
float res;
// convert double data type to float type
cout << " \n \n The length of the rectangle is: " << l << endl;
cout << " The breadth of the rectangle is: " << b << endl;
res = (float) l * b; // cast into float type
cout << " The area of the rectangle is: " << res;
return 0;
}
输出:
The length of the rectangle is:
57.3456
The breadth of the rectangle is:
12.9874
The area of the rectangle is: 740
The length of the rectangle is: 57.3456
The breadth of the rectangle is: 12.9874
The area of the rectangle is: 744.77
类型转换的一些不同类型
在类型转换中,有一个转换运算符根据程序的需求将一个数据类型强制转换为另一个数据类型。C++有四种不同类型的转换运算符:
- Static_cast
- dynamic_cast
- const_cast
- reinterpret_cast
Static Cast:
static_cast是一个简单的编译时转换,将一个数据类型转换或强制转换为另一个数据类型。这意味着它在运行时不检查转换是否有效。因此,程序员或用户有责任确保转换是安全和有效的。
static_cast足够强大,可以执行隐式转换执行的所有转换。它还可以执行与彼此相关的类的指针之间的转换(向上转换-从派生类到基类或向下转换-从基类到派生类)。
Static Cast的语法
static_cast < new_data_type> (expression);
演示使用静态转换的程序
我们来创建一个简单的示例来使用C++编程中的静态类型转换。
#include
using namespace std;
int main ()
{
// declare a variable
double l;
l = 2.5 * 3.5 * 4.5;
int tot;
cout << " Before using the static cast:" << endl;
cout << " The value of l = " << l << endl;
// use the static_cast to convert the data type
tot = static_cast < int > (l);
cout << " After using the static cast: " << endl;
cout << " The value of tot = " << tot << endl;
return 0;
}
输出:
Before using the static cast:
The value of l = 39.375
After using the static cast:
The value of tot = 39
动态转换
dynamic_cast是一个在运行时用于执行将一个类型的变量转换为另一个类型的类指针和引用之间的转换的运算符。它意味着它在运行时检查变量的有效转换,如果转换失败,则返回一个空值。动态转换基于RTTI(运行时类型识别)机制。
C++中使用动态转换演示程序
让我们创建一个简单的程序来在C++编程语言中执行dynamic_cast。
#include
using namespace std;
class parent
{
public: virtual void print()
{
}
};
class derived: public parent
{
};
int main ()
{
// create an object ptr
parent *ptr = new derived;
// use the dynamic cast to convert class data
derived* d = dynamic_cast (ptr);
// check whether the dynamic cast is performed or not
if ( d != NULL)
{
cout << " Dynamic casting is done successfully";
}
else
{
cout << " Dynamic casting is not done successfully";
}
}
输出:
Dynamic casting is done successfully.
重新解释强制转换类型
reinterpret_cast类型转换用于将指针转换为任何其他类型的指针,无论给定的指针是否属于彼此。这意味着它不检查指针或指针指向的数据是否相同。它还可以将指针转换为整数类型,反之亦然。
重新解释强制转换类型的语法
reinterpret_cast <type> expression;
在C++中使用Reinterpret Cast的程序
让我们编写一个程序来演示在C++语言中使用reinterpret进行指针转换。
#include <iostream>
using namespace std;
int main ()
{
// declaration of the pointer variables
int *pt = new int (65);
// use reinterpre_cast operator to type cast the pointer variables
char *ch = reinterpret_cast <char *> (pt);
cout << " The value of pt: " << pt << endl;
cout << " The value of ch: " << ch << endl;
// get value of the defined variable using pointer
cout << " The value of *ptr: " << *pt << endl;
cout << " The value of *ch: " << *ch << endl;
return 0;
}
输出:
The value of pt: 0x5cfed0
The value of ch: A
The value of *ptr: 65
The value of *ch: A
Const Cast
const_cast用于改变或操纵源指针的const行为。它意味着我们可以以两种方式执行const:将const指针设置为非const指针,或删除或移除const指针上的const。
Const Cast语法
const_cast <type> exp;
使用 C++ 中的 const_cast 进行类型转换的程序
让我们编写一个程序,使用 const_cast 在 C++ 中将源指针转换为非 const 指针。
#include
using namespace std;
// define a function
int disp(int *pt)
{
return (*pt * 10);
}
int main ()
{
// declare a const variable
const int num = 50;
const int *pt = # // get the address of num
// use const_cast to chnage the constness of the source pointer
int *ptr = const_cast (pt);
cout << " The value of ptr cast: " << disp(ptr);
return 0;
}
输出:
The value of ptr cast: 500