说说强制类型转换运算符
「static_cast」[*]用于非多态类型的转换
[*]不执行运行时类型检查(转换安全性不如 dynamic_cast)
[*]通常用于转换数值数据类型(如 float -> int)
[*]可以在整个类层次结构中移动指针,子类转化为父类安全(向上转换),父类转化为子类不安全(因为子类可能有不在父类的字段或方法)
「dynamic_cast」
[*]用于多态类型的转换
[*]执行行运行时类型检查
[*]只适用于指针或引用
[*]对不明确的指针的转换将失败(返回 nullptr),但不引发异常
[*]可以在整个类层次结构中移动指针,包括向上转换、向下转换
「const_cast」
[*]用于删除 const、volatile 和 __unaligned 特性(如将 const int 类型转换为 int 类型 ) reinterpret_cast
[*]用于位的简单重新解释
[*]滥用 reinterpret_cast 运算符可能很容易带来风险。除非所需转换本身是低级别的,否则应- 使用其他强制转换运算符之一。
[*]允许将任何指针转换为任何其他指针类型(如 char* 到 int* 或 One_class* 到Unrelated_class* 之类的转换,但其本身并不安全)
[*]也允许将任何整数类型转换为任何指针类型以及反向转换。
[*]reinterpret_cast 运算符不能丢掉 const、volatile 或 __unaligned 特性。
[*]reinterpret_cast 的一个实际用途是在哈希函数中,即,通过让两个不同的值几乎不以相同的索引结尾的方式将值映射到索引。
「bad_cast」
[*]由于强制转换为引用类型失败,dynamic_cast 运算符引发 bad_cast 异常。
bad_cast 使用try {
Circle& ref_circle = dynamic_cast<Circle&>(ref_shape);
}
catch (bad_cast b) {
cout << "Caught: " << b.what();
} 这几个运算符还真没用过,强制转换时候都是加括号 有时候会强转不过来,为何 还是用()方便 关于 C++ 中四种强制类型转换运算符 static_cast、dynamic_cast、const_cast 和 reinterpret_cast 的详细解释确实比较繁琐,我也回帖记录一下。、 一般强制类型转换运算符是一种显式改变数据类型的操作符,通过(type)语法将表达式转换为指定类型。它能突破隐式转换限制,如将浮点值截断为整数、指针类型间转换。但过度使用可能丢失精度(如double转int)或引入未定义行为(如不兼容指针转换),需谨慎权衡安全性与需求。
页:
[1]