设为首页 加入收藏

TOP

19.10 强制:尾声
2013-10-07 15:07:01 来源: 作者: 【 】 浏览:64
Tags:19.10 强制 尾声

19.10  强制:尾声

前面我们已经看到如何用函数或类来实现强制。前者更为直观,但在面对许多任务时显得有点力不从心。而采用类的形式,我们就可以将若干强制中的公共代码分解出来,并放进一个公共的父类中,而且我们还能够更容易地对强制的潜在使用进行约束。当使用类的形式实现强制时,我们必须采取一些措施来最大限度地防止对该(强制)类的实例的误用(它们只能被当成临时对象来使用)。可以采取的措施包括对类的操作符以及它们的返回值类型进行限制,以及对类的语义提供清晰明确的文档描述。

我们同样还关注了强制失败的情况。C++(www.cppentry.com)内建的4种强制对失败的情况都具有固定且定义良好的行为。const_cast、static_cast以及reinterpret_cast如果失败就不能通过编译。dynamic_cast如果失败则分为两种情况:对于指针,它会在运行期返回一个空指针,而对于引用则是抛出一个std::bad_cast异常。所以,当我们在实现一个"仿强制"操作符的时候,其失败时所具有的反应应该予以精心考虑。只要有可能,编译期失败总是要优于运行期失败。explicit_cast和literal_cast如果失败都会导致编译期错误,union_cast的失败响应也主要是在编译期。而接口强制(interface cast)和ptr_cast则必须等到运行期才可能对强制失败作出反应。

对于运行期失败,返回空值还是抛出异常,这两者孰优孰劣可能并没有明确的答案。尤其是在编写通用库或开源库时,这两种场合下你根本无法预期你的代码将来会处于什么样的上下文中,所以一开始就给出明确的限制是无济于事的。在这种情况下,一种较好的解决方案是像interface_cast_addref那样使用参数化的策略类。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇19.8.5 保护引用计数 下一篇为什么我希望用C而不是C++来实现Z..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: