包含4个函数:
polymorphic_cast
polymorphic_downcast
numeric_cast
lexical_cast
与C++风格转型的区别:它们明确无误地表达了程序员的意图
dynamic_cast的这种对指针和引用类型的不同行为:
指针---- 转型失败---空指针
引用-----转型失败----异常
问题:容易忘记测试指针是否为空
解决:polymorphic_cast
特点:
1】 转型失败时总是抛出一个std::bad_cast异常。
2】 它是一个函数,必要时可以被重载
使得代码更清晰,类型转换也更少错误
3】 仅针对指针的向下转型和交叉转型,没有针对引用类型的版本
向下转型:从基类向派生类的向下转型
交叉转型:即从一个基类到另一个基类。
好处:不需要测试空指针,失败时总抛出异常,也不会把错误传播到函数以外。
使用dynamic_cast时-----测试指针的有效性
derived*p=dynamic_cast<derived*>(p1)
if(!p)
{...}
使用场合:
当(指针)转型失败被认为是异常时,polymorphic_cast比dynamic_cast更能清晰地表明代码的意图;
对引用类型执行多态转型时,仍然使用dynamic_cast
对dynamic_cast的简单包装(返回的指针为空,就抛出异常)
仅仅对指针进行向下/交叉转型
————————————————————————————————————————————————————————
原因:有时dynamic_cast被认为太过低效:需要额外的运行时间
为了避免这些代价,常常会诱使你使用static_cast, 它没有这些性能代价
办法:
为了确保用static_cast进行向下转型是安全的,你必须确保对每次要执行的转型进行测试。
step1:用dynamic_cast进行了转型的测试;
step2:然后它就使用static_cast去执行转型。
场合:
如果向下转型真的是必须的,并且被证实是性能的瓶颈,polymorphic_downcast就是你需要的。好处:提升它带来的性能,获得static_cast的速度。
——————————————————————————————————————————————————————
原因:整数类型间的转换经常会产生意外的结果。
从较大的类型(例如long)向较小的类型(例如short)赋值,有可能数值过大或过小而不能被目标类型所表示
原来:出现莫名其妙的数字,引起未定义或令人惊讶的行为
现在:抛出bad_numeric_cast异常
numeric_cast可以确保转换是有效的、合法的,否则就不允许转换。但:
numeric_cast不能帮助我们在浮点数间的转换中避免精度的损失。
————————————————————————————————————————————————————————————-自定义类型进行文字转换时需要满足:
1,源类型必须是可流输出的(OutputStreamable),
而目标类型必须是可流输入的 (InputStreamable)。,
2.两种类型都必须是可复制构造的(CopyConstructible),
并且目标类型还要是可缺省构造的 (DefaultConstructible)和可赋值的
(Assignable)。
可流输出(OutputStreamable)意味着存在一个为该类型定义的 operator<<
可流输入InputStreamable)则要求有一个 operator>>
对于许多类型,包括所有内建类型和标准库中的字符串类型,这个条件都满足。
std::string s="42";
inti=boost::lexical_cast<int>(s);以下情况时使用 lexical_cast:
●
从字符串类型到数值类型的转换
●
从数值类型到字符串类型的转换
●
你的 自定义类型所支持的所有字面转换