C和C++的类型转换
2021-05-01 16:27
标签:目标 读取 内存 block poi point strong dynamic 符号 C方式的类型转换方式: C方式强制类型转换存在的问题: 过于粗暴—— 任意类型之间都可以进行转换,编译器很难判断其正确性 难于定位—— 在源码中无法快速定位所有使用强制类型转换的语句 C++将强制类型转换分为四种不同的类型,分别是 使用要点: 使用要点: 使用要点: 使用要点: 补充说明: 使用dynamic_cast转换如果不成功,将得到空指针,成功将返回指向类对象的指针或引用; dynamic_cast是运行时处理的,而其他三种都是编译时处理的; 在类族中进行上行转换时,dynamic_cast和static_cast的效果是一样的,但在下行转换时,dynamic_cast具有类型检查功能,比static_cast更安全。 上行转换:子类向父类转换(C++中的继承是全部接收,故父类的成员子类都具有,进行上行转换时一般不会有问题) 下行转换:父类向子类转换; 下行转换的成功与否与将要转换的类型有关,即「将要转换的类指针(或引用)所指向对象的实际类型」与「转换结果对象的类型」一定要相同,否则转换失败。 C和C++的类型转换 标签:目标 读取 内存 block poi point strong dynamic 符号 原文地址:https://www.cnblogs.com/coro/p/13205907.htmlC语言传统的类型转换
(Type) (Expression)
或Type (Expression)
,后者比较古老。C风格的强制类型转换容易出问题,比较粗暴,如:typedef void(PF)(int);
struct Point {
int x; int y;
};
int v = 0x12345;
PF* pf = (PF*)v; //转换方式过于粗暴,试问:能否保证变量v作为地址是否一定指向PF*类型的函数入口
char c = char(v); //char类型的数据取值范围有限,能否保证整型数v按照char方式转换一定会在其值域中
Point* p = (Point*)v; //同样,无法保证将v作为Point*类别的地址值,该地址值一定是一个Point结构体对象的地址
C++的新类型转换
static_cast
、const_cast
、dynamic_cast
、reinterpret_cast
,其用法为xxx_cast
。static_cast
const_cast
reinterpret_cast
dynamic_cast
代码演示
#include