📅  最后修改于: 2023-12-03 14:40:00.277000             🧑  作者: Mango
C++中有多种类型转换方式,包括隐式类型转换和显式类型转换。本文将详细介绍C++中的类型转换。
隐式类型转换是指在程序中自动进行类型转换而无需进行任何显式的指示。
当两种不同类型的数值类型进行运算时,C++会将其中一种类型转换为另一种类型,以保证能够正常运算。例如:
int a = 10;
double b = 3.14;
double c = a + b; // a会被自动转换为double类型
此外,在返回类型为数值类型的函数中,从函数的返回值类型自动转换为相应的表达式类型。例如:
int getArea(int length, int width) {
return length * width;
}
double area = getArea(5, 6); // getArea返回值会被自动转换为double类型
在C++中,派生类是基类的一种扩展。因此,可以将派生类的对象转换为基类的对象。例如:
class Person {
public:
string name;
int age;
};
class Student : public Person {
public:
string school;
};
Student stu;
stu.name = "Tom";
stu.age = 20;
stu.school = "MIT";
Person person = stu; // 将派生类Student对象自动转换为基类Person对象
显式类型转换是指在程序中通过指定转换方式来进行类型转换。
C风格的类型转换使用一对小括号,内部填写欲转换的目标类型。例如:
int a = 10;
double b = (double)a; // C风格的类型转换
float c = 3.14f;
int d = (int)c; // C风格的类型转换
static_cast进行非动态类型转换,例如数值类型转换或将指针或引用转换为更广泛的类型。static_cast的使用方法如下:
int a = 10;
double b = static_cast<double>(a); // static_cast
float c = 3.14f;
int d = static_cast<int>(c); // static_cast
使用static_cast进行指针类型转换时,需要注意的是,只能将指向派生类的指针或引用转换为指向其基类的指针或引用,或将void指针转换为任意其他指针类型。例如:
class Person {
public:
string name;
int age;
};
class Student : public Person {
public:
string school;
};
Student *stu = new Student();
Person *person = static_cast<Person*>(stu); // 将指向派生类的指针转换为指向基类的指针
dynamic_cast用于将指针或引用转换为其派生类类型。如果无法进行转换,则返回空指针或抛出异常。使用dynamic_cast的语法如下:
class Person {
public:
virtual ~Person() {}
};
class Student : public Person {
public:
virtual ~Student() {}
};
Person *person = new Student();
Student *stu = dynamic_cast<Student*>(person); // 将指向基类的指针转换为指向派生类的指针
需要注意的是,使用dynamic_cast进行类型转换时,必须将基类声明为虚基类,否则dynamic_cast将无法正常工作。
reinterpret_cast用于将指针或引用转换为不相关的类型,例如将int指针转换为char指针,或将指针转换为整数类型。然而,由于reinterpret_cast进行的是无关类型之间的转换,因此使用时需要十分小心,否则可能会导致意料之外的结果。使用reinterpret_cast的语法如下:
int a = 10;
char *c = reinterpret_cast<char*>(&a); // reinterpret_cast
int *p = reinterpret_cast<int*>(0x12345678); // 将指针转换为整数类型
const_cast用于将常量指针或常量引用转换为非常量指针或非常量引用。使用const_cast的语法如下:
const int a = 10;
int *b = const_cast<int*>(&a); // const_cast