一、C语言中的类型转换
在C语言中有两种类型转换,隐式类型转换和显示类型转换。
如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。
隐式类型转换:是编译器在编译期间自动转换,不能转就报错。
显式类型转换:用户自己转换。
int x = 1;
//隐式类型转换
double y = x;
cout << y << endl;
int* p = &x;
//用户自己显示类型转换
int addr = (int)p;
cout << addr << endl;
二.C++需要四种强制类型转换的理由
在C语言中有很多类型转换的可视性不是很好或者存在精度问题,如以下可视性例子:
三.C++中四种强制类型转换
标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符。
1.static_cast
static_cast多用于静态转换,简单说就是用于两个相关类型
int x = 1;
double y = static_cast<double>(x);
cout << y << endl;
2.reinterpret_cast
reinterpret_cast用于处理不同类型之间的转换。可以将一个指针或引用转换为另一种类型,且不需要进行任何类型检查或安全检查。
int* p = &x;
int addr = reinterpret_cast<int>(p);
cout << addr << endl;
3.const_cast
const_cast用于去除变量的const属性。
volatile const int i = 0;
int* p = const_cast<int*>(&i);
*p = 19;
cout << i << endl;
cout << *p << endl;
4.dynamic_cast
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)
注意:
1. dynamic_cast只能用于父类含有虚函数的类
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr或者抛异常
#include <iostream>
class Base {
public:
virtual void show() {
std::cout << "Base class" << std::endl;
}
};
class Derived : public Base {
public:
void show() {
std:: cout << "Derived class" << std::endl;
}
};
int main() {
Base* basePtr = new Derived;
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if(derivedPtr) {
derivedPtr->show(); // 输出:Derived class
} else {
std::cout << "Failed to cast to Derived class" << std::endl;
}
delete basePtr;
return 0;
}