- 博客(26)
- 资源 (4)
- 收藏
- 关注
原创 More Effective C++ Item 附2:一个auto_ptr的实现实例
More Effective C++的前言、导读和附1(侯捷译),以及在 “C++ 中计算物件个数”和“为智能指标实作 operator->*”(陈崴译,原发表于程序员杂志),可在侯捷的站点下载到。 一个auto_ptr的实现实例Items M9、M10、E26、E31和E32证明了auto_ptr模板类的非同寻常的作用。不幸的是,目前很少有编译器地提供了一个“正确”的实现(注1)。Ite
2002-03-31 15:46:00 1557
原创 More Effective c++ Item M29:引用计数
1.1 Item M29:引用计数引用计数是这样一个技巧,它允许多个有相同值的对象共享这个值的实现。这个技巧有两个常用动机。第一个是简化跟踪堆中的对象的过程。一旦一个对象通过调用new被分配出来,最要紧的就是记录谁拥有这个对象,因为其所有者--并且只有其所有者--负责对这个对象调用delete。但是,所有权可以被从一个对象传递到另外一个对象(例如通过传递指针型参数),所以跟踪一个对象的所有权是很困
2002-03-31 15:44:00 1986
原创 More Effective C++ Item M30:代理类
1.2 Item M30:代理类虽然你和你的亲家可能住在同一地理位置,但就整个世界而言,通常不是这样的。很不幸,C++还没有认识到这个事实。至少,从它对数组的支持上可以看出一些迹象。在FORTRAN、BASIC甚至是COBOL中,你可以创二维、三维乃至n维数组(OK,FORTRAN只能创最多7维数组,但别过于吹毛求疵吧)。但在C++中呢?只是有时可以,而且也只是某种程度上的。这是合法的:int d
2002-03-31 15:44:00 1516
原创 More Effective C++ Item M32:在未来时态下开发程序
2. 杂项我们现在到了接近结束的部分了,这章讲述的是一些不属于前面任一章节的指导原则。开始两个是关于C++软件开发的,描述的是设计适应变化的系统。面向对象的一个强大之处是支持变化,这两个条款描述具体的步骤来增强你的软件对变化的抵抗能力。然后,我们分析怎么在同一程序中进行C和C++混合编程。这必然导致考虑语言学之外的问题,但C++存在于真实世界中,所以有时我们必须面对这种事情。最后,我将概述C++语
2002-03-31 15:44:00 977
原创 More Effective C++ Item M34:如何在同一程序中混合使用C++和C
Item M34:如何在同一程序中混合使用C++和C许多年来,你一直担心编制程序时一部分使用C++一部分使用C,就如同在全部用C编程的年代同时使用多个编译器来生成程序一样。没办法多编译器编程的,除非不同的编译器在与实现相关的特性(如int和double的字节大小,传参方式)上相同。但这个问题在语言的标准化中被忽略了,所以唯一的办法就是两个编译器的生产商承诺它们间兼容。C++和C混合编程时同样是这个
2002-03-31 15:44:00 1451 1
原创 More Effective C++ Item M35:让自己习惯使用标准C++语言
Item M35:让自己习惯使用标准C++语言自1990年出版以来,《The Annotated C++ Reference Manual 》(见原书P285,附录:推荐读物)是最权威的参考手册供程序员们判断什么是C++拥有的而什么不是。在它出版后的这些年来,C++的ISO/ANSI标准已经发生了大大小小的变化了(主要是扩充)。作为权威手册,它已经不适用了。在《ARM》之后C++发生的变化深远地影
2002-03-31 15:44:00 2027
原创 More Effective C++ Item M31:让函数根据一个以上的对象来决定怎么虚拟
1.3 Item M31:让函数根据一个以上的对象来决定怎么虚拟有时,借用一下Jacqueline Susann的话:一次是不够的。例如你有着一个光辉形象、崇高声望、丰厚薪水的程序员工作,在Redmond,Wshington的一个著名软件公司--当然,我说的就是任天堂。为了得到经理的注意,你可能决定编写一个video game。游戏的背景是发生在太空,有宇宙飞船、太空站和小行星。在你构造的世界中的
2002-03-31 15:43:00 1441
原创 More Effective C++ Item M33:将非尾端类设计为抽象类
Item M33:将非尾端类设计为抽象类假设你正在从事一个软件项目,它处理动物。在这个软件里,大多数动物能被抽象得非常类似,但两种动物--晰蜴和小鸡--需要特别处理。显然,晰蜴和小鸡与动物类的联系是这样的: Animal | | / / / / / / Lizard Chicken动物类处理所有动物共有的特性
2002-03-31 15:43:00 1432
原创 C与C++中的异常处理
1. 异常和标准C对它的支持(前言略)1.1 异常分类 基于Dr. GUI的建议,我把我的第一个专栏投入到“程序异常”的系列上。我认识到,“exception”这个术语有些不明确并和上下文相关,尤其是C++标准异常(C++ standard exceptions)和Microsoft的结构化异常(structured exception handling)。不幸的
2002-03-01 08:54:00 1837 1
原创 C与C++中的异常处理8
1. 自动删除,类属new和delete、placement new 和placement delete 在上次结束时,我期望道:当一个新产生的对象在没有完全构造时,它所占用的内存能自动释放。很幸运,C++标准委员会将这个功能加入到了语言中(而不幸的是,这个特性加得太晚了,许多编译器还不支持它)。Visual C++ 5和6都支持这个“自动删除”特性(但,如我们将要看到的,Vis
2002-03-01 08:54:00 1235
原创 C与C++中的异常处理2(part1)
1. Microsoft对异常处理方法的扩展 前次,我概述了异常的分类和C标准库支持的处理方法。这次讨论Microsoft对这些方法的扩展:结构化异常处理(SEH)和Microsoft Foundation Class (MFC)异常处理。SEH对C和C++都有效,MFC异常体系只对C++有效。 1.1 机构化异常处理 机构化异常处理是Windows提供
2002-03-01 08:53:00 1963
原创 C与C++中的异常处理2(part2)
1.1 版本3:恢复异常 接下来,改: __except(except_filter(3, EXCEPTION_CONTINUE_SEARCH)) 为:__except(except_filter(3, EXCEPTION_CONTINUE_EXECUTION)) 重新编译并运行。可以看到这样的输出:0:before first try1:
2002-03-01 08:53:00 1418
原创 C与C++中的异常处理3
1. 标准C++异常处理的基本语法和语义 这次,我来概述标准C++异常处理的基本语法和语义。顺便,我会将它和前两次提到的技术进行比较。(在本文及以后,我将标准C++异常处理简称为EH,将微软的方法称为SEH。)1.1 基本语法和语义 EH引入了3个新的C++语言关键字:l catchl throwl
2002-03-01 08:53:00 1796
原创 C与C++中的异常处理4
1. 实例剖析EH 到现在为止,我仍然逗留在C和C++的范围内,但这次要稍微涉及一下汇编语言。目标:初步揭示Visual C++对EH的throw和catch的实现。本文不是巨细无遗的,毕竟我的原则是只关注(C/C++)语言本身。然而,简单的揭示EH的实现对理解和信任EH大有帮助。1.1 我们所害怕的唯一一件事 在throw过程中退栈时,EH追踪哪个局部对象
2002-03-01 08:53:00 1269
原创 C与C++中的异常处理5
1. C++的new和delete操作时的异常处理 今天,我们开始学习C++的new和delete操作时的异常处理。首先,我将介绍标准C++运行库对new和delete操作的支持。然后,介绍伴随着这些支持的异常。1.1 New和Delete表达式 当写B *p = new D;这里,B和D是class类型,并且有构造和析构函数,编译器实际产生的代码大
2002-03-01 08:53:00 1236
原创 C与C++中的异常处理6
1. Microsoft对于的实现版本中的异常处理上次,我讲述了标准运行库头文件中申明的12个全局函数中的异常行为。这次我将开始讨论Microsoft对这些函数的实现版本。 在Visual C++ 5中,标准运行库头文件提供了这些申明:namespace std { class bad_alloc; struct nothrow_t; ex
2002-03-01 08:53:00 1286
原创 C与C++中的异常处理7
1. 部分构造及placement delete讨论在一般情况下的部分构造、动态生成对象时的部分构造,以及用 placement delete来解决部分构造问题。 C++标准要求标准运行库头文件提供几个operator delete的重载形式。在这些重载形式中,Visual C++ 6缺少:l void operator delete(void *,
2002-03-01 08:52:00 1110
原创 C与C++中的异常处理9
1. placement new 和placement delete,及处理构造函数抛出的异常 当被调用了来清理部分构造时,operator delete的第一个void *参数带的是对象的地址(刚刚由对应的operator new返回的)。operator delete的所有额外placement参数都和传给operator new的相应参数的值相匹配。 在代码里,语
2002-03-01 08:52:00 1071
原创 C与C++中的异常处理10
1. 从私有子对象中产生的异常 几部分来,我一直展示了一些技巧来捕获从对象的构造函数中抛出的异常。这些技巧是在异常从构造函数中漏出来后处理它们。有时,调用者需要知道这些异常,但通常(如我所采用的例程中)异常是从调用者并不关心的私有子对象中爆发的。使得用户要关心“不可见”的对象表明了设计的脆弱。 在历史上,(可能抛异常)的构造函数的实现者没有简单而健壮的解决方法。看这个简
2002-03-01 08:51:00 1173
原创 C与C++中的异常处理11
1. 异常规格申明 现在是探索C++标准运行库和Visual C++在头文件中申明的异常支持的时候了。根据C++标准(subclause 18.6,“Exception handling” )上的描述,这个头文件申明了:l 从运行库中抛出的异常对象的基类。l 任何抛出的违背异常规格申明的对象的可能替代物。l 在违背异常规
2002-03-01 08:51:00 1753 1
原创 C与C++中的异常处理12
1. unexpected()的实现上固有的限制 上次,我介绍了C++标准运行库函数unexpected(),并展示了Visual C++的实现版本中的限制。这次,我想展示所有unexpected()的实现上固有的限制,以及绕开它们的办法。 1.1 异常处理函数是全局的、通用的 我在上次简要地提过这点,再推广一点:过滤unexpected异常的异常处理函
2002-03-01 08:51:00 1074
原创 C与C++中的异常处理13
1. 异常安全 接下来两次,我将讨论“异常安全”,C++标准中使用了(在auto_ptr中)却没有定义的术语。在C++范围内,不同的作者使用这个术语却表达不同的含义。在我的专题中,我从两个方面来定义“异常安全”:l 如果一个实体捕获或抛出一个异常,但仍然维持它公开保证的语义,它就是“接口安全”的。依赖于它保证的力度,实体可能不允许将任何异常漏给其用户。l
2002-03-01 08:51:00 1002
原创 C与C++中的异常处理14
1. 模板安全 上次,我开始讨论异常安全。这次,我将探究模板安全。 模板根据参数的类型进行实例化。因为通常事先不知道其具体类型,所以也无法确切知道将在哪儿产生异常。你大概最期望的就是去发现可能在哪儿抛异常。这样的行为很具挑战性。 看一下这个简单的模板类:template class wrapper {public: wrapper(
2002-03-01 08:51:00 1033
原创 C与C++中的异常处理15
1. 模板安全(续) 在异常安全的第二部分,我讲了在构造函数和析构函数中导致资源泄漏的问题。这次将探索另外两个问题。并且以推荐读物列表结束。1.1 Problem #2:get 上次,我定义X::get()为:T get() { return *value_; } 这个定义有点小小的不足。既然get()不改变wrapp
2002-03-01 08:51:00 960
原创 C与C++中的异常处理16
1. 指导方针 根据读者们的建议,经过反思,我部分修正在Part14中申明的原则:l 只要可能,使用那些构造函数不抛异常的基类和成员子对象。l 不要从你的构造函数中抛出任何异常。 这次,我将思考读者的意见,C++先知们的智慧,以及我自己的新的认识和提高。然后将它们转化为指导方针来阐明和引申那些最初的原则。 (关键字说明:
2002-03-01 08:51:00 1432
原创 C与C++中的异常处理17
1. C++异常和Visual C++ SEH的混合使用 我在Part2介绍了Structured Exception Handling(简称SEH)。在那时我就说过,SEH是window及其平台上的编译器专有的。它不是定义在ISO C++标准中的,使用它的程序将不能跨编译器移植。因为我注重于标准兼容和可移植性,所以我对将windows专有的SEH映射为ISO标准C++的exce
2002-03-01 08:51:00 1507
编译宏控过滤和宏替换工具stedit1.2.5pro
2013-02-20
统计函数平均长度和最大长度
2009-06-16
统计函数平均长度和最大长度
2009-06-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人