- 博客(23)
- 资源 (13)
- 收藏
- 关注
原创 第11 章 其它编程经验
<br /><br />11.1 使用const 提高函数的健壮性<br /> 看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的<br />魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。<br />11.1.1 用const 修饰函数的参数<br /> 如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修
2010-11-18 10:45:00 801
原创 第10 章 类的继承与组合
<br /><br />10.1 继承<br /> C++的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用,才要防止乱用“继承”。我们应当给“继承”立一些使用规则。<br /> <br />【规则10-1-1】如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B继承A 的功能和属性。不要觉得“白吃白不吃”,让一个好端端的健壮青年无缘无<br />故地吃人参补身体。<br />【规则10-1-2】若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的
2010-11-18 10:43:00 606
原创 第9 章 类的构造函数、析构函数与赋值函数
<br /><br />9.2 构造函数的初始化表<br />构造函数初始化表的使用规则:<br />
2010-11-18 10:41:00 589
原创 第八章 C++函数的高级特性(8.3 参数的缺省值 8.4 运算符重载 8.5 函数内联)
<br /><br />8.3 参数的缺省值<br />参数缺省值的使用规则:<br />【规则8-3-1】参数缺省值只能出现在函数的声明中,而不能出现在定义体中。<br />例如:<br />void Foo(int x=0, int y=0); // 正确,缺省值出现在函数的声明中<br />void Foo(int x=0, int y=0) // 错误,缺省值出现在函数的定义体中<br />{<br />⋯<br />}<br /> <br />【规则8-3-2】如果函数有多个参数,参数只能从后向前
2010-11-18 10:37:00 871
原创 第八章 C++函数的高级特性(8.2 成员函数的重载、覆盖与隐藏)
8.2 成员函数的重载、覆盖与隐藏成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。#include class Base{public:void f(int x){ cout void f(float x){ cout virtual void g(void){ co
2010-11-18 10:31:00 733
原创 第八章 C++函数的高级特性(8.1 函数重载的概念)
8.1 函数重载的概念1.如果C++程序要调用已经被编译后的C 函数,该怎么办?void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。例如:extern “C”{void foo(int x, int y);⋯ // 其它函数}或者写成extern “C”{
2010-11-18 10:10:00 663
原创 高质量C++编程之(7.10 malloc/free 的使用要点 7.11 new/delete 的使用要点)
<br /><br />7.10 malloc/free 的使用要点<br />函数malloc 的原型如下:<br />void * malloc(size_t size);<br />用malloc 申请一块长度为length 的整数类型的内存,程序如下:<br />int *p = (int *) malloc(sizeof(int) * length);<br />我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。<br />
2010-11-18 10:05:00 593
原创 高质量C++编程之(7.8 有了malloc/free 为什么还要new/delete ?7.9 内存耗尽怎么办?)
<br /><br />7.8 有了malloc/free 为什么还要new/delete ?<br /> malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象在消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任
2010-11-18 09:58:00 699
原创 高质量C++编程之(7.7 杜绝“野指针”)
<br /><br />7.7 杜绝“野指针”<br />“野指针”不是NULL 指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if 语句很容易判断。但是“野指针”是很危险的,if 语句对它不起作用。<br />“野指针”的成因主要有两种:<br />(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL 指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么<br />将指针设置为NULL,要么让它指向合法的内存。<br />例如<br
2010-11-18 09:54:00 701
原创 高质量C++编程之(7.5 free 和delete 把指针怎么啦? 7.6动态内存会被自动释放吗?)
<br /><br />7.5 free 和delete 把指针怎么啦?<br /> 别看free 和delete 的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。用调试器跟踪示例7-5,发现指针p 被free 以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p 成了“野指针”。如果此时不把p 设置为NULL,会让人误以为p 是个合法的指针。如果程序比较长,我们有时记不住p 所指的内存是否已经被释放,在继续使用p 之前,通常会用语句if
2010-11-18 09:51:00 1068
原创 高质量C++编程之(7.4指针参数是如何传递内存的?)
<br /><br />7.4 指针参数是如何传递内存的?<br /> 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1 中,Test 函数的语句GetMemory(str, 200)并没有使str 获得期望的内存,str 依旧是NULL,<br />为什么?<br />void GetMemory(char *p, int num)<br />{<br />p = (char *)malloc(sizeof(char) * num);<br />}<br />void Test
2010-11-18 09:47:00 608
原创 第七章 内存管理(常见内存错误,指针数组的比较)
<br /><br />7.2 常见的内存错误及其对策<br /> 问题1: 内存分配未成功,却使用了它<br /> 解决办法:在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。<br /> 问题2: 内存分配虽然成功,但是尚未初始化就引用它。<br /> 问题3: 内存分配成功并且已经初始化,但操作越过了内
2010-11-18 09:44:00 635
原创 第十一章 处理概括关系
第十一章 处理概括关系 Dealing with Generalization11.1 Pull Up Field(值域上移)症状:两个subclasses拥有相同的值域解决办法:将此一值移至superclass.11.2 Pull Up Method(函数上移)症状:有些函数,在各个subclass中产生完全相同的结果。解决办法:将该函数移至superclass.11.3 Pull Up Constructor Body(构造函数体上移)症状:你在各个子类中拥有一些构造函数,它们的本体(代码)几乎完
2010-11-16 19:53:00 744
原创 第十章 简化函数调用
<br /> <br />第十章 简化函数调用 Making Method Calls Simpler<br /> <br />10.1 Rename Method(重命名函数)<br />症状:函数的名称未能揭示函数的用途。<br />解决办法:修改函数名称<br /> <br /> <br />10.2 Add Parameter(添加参数)<br />症状:某个函数需要从调用端得到更多信息<br />解决办法:为此函数添加一个对象参数,让该对象带进函数所需信息<br /> <br /> <br
2010-11-16 19:50:00 578
原创 第九章 简化条件表达式
<br /><br />第九章 简化条件表达式 Simplifying Conditional Expressions<br /> <br />9.1 Decompose Conditional(分解条件式)<br />症状:你有一个复杂的条件(if-then-else)语句<br />解决办法:从if-then-else三个段落中分别提炼出独立函数。<br /> <br />9.2 Consolidate Conditional Expression(合并条件式)<br />症状:你有一系列条件测
2010-11-16 19:46:00 730
原创 第八章 重新组织数据(Organizing Data)
第八章 重新组织数据(Organizing Data)8.1 Self Encapsulate Field(自封装值域) 就是set get函数症状:你直接访问一个值域(field),但与值域直接按的耦合关系逐渐变得笨拙。解决办法:为这个值域建立取值/设值函数(getting/setting methods),并且只以这些函数来访问值域。8.2 Replace Data Value with Object(以对象取代数据值)症状:你有一笔数据项(data item),需要额外的数据和行为。解决办法
2010-11-16 19:41:00 1023
原创 第七章 在对象之间搬移特性
第七章 在对象之间搬移特性(Moving Features Between Objects)7.1 Move Method(搬移函数)症状:你的程序中,有个函数与其所驻class之外的另一个class进行更多交流;调用后者或被后者调用。解决办法:在该函数最常引用的class中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者是将旧函数完全移除。7.2 Move Field(搬移值域)症状:你的程序中,某个field(值域)被其所驻class之外的另一个class更多地用到。解决办法:在t
2010-11-16 19:37:00 646
原创 第六章 重新组织你的函数
6.1 Extract Method(提炼函数)动机:当看见一个过长的函数或者一段需要注释才能让人理解用途的代码,就需要将这段代码放进一个独立函数中一段代码可以被组织在一起并独立出来。 三种情况:(局部变量替换为查询式即可)1)无局部变量2)有局部变量3)对局部变量再赋值6.2 Inline Method(将函数内联化) 一个函数,其本体(method body)应该与其名称(method name)同样清楚易懂。在函数调用点插入函数本体,然后移除该函数。三种主要情况:1)内部代码吧和函数名称同
2010-11-16 19:33:00 780
原创 设计模式之十四 观察者模式(老板回来我不知道)
类似于订阅模式 观察者模式(Observer)(又叫做发布-订阅‘Publish/Subscribe’模式),定义了一种一对多的依赖关系,让多个 观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个借口实现。它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。 Obse
2010-11-07 11:52:00 1167
原创 设计模式之十三 建造者模式(建造小人)
<br /><br /> 建造者模式(Builder)(又叫生成器模式),将一个复杂对象的构建和表示分离,使得同样的构建过程可以创建不同的表示。<br /> Builder是为创建一个Product对象的各个部件指定的抽象接口;<br /> ConcreteBuilder是具体的建造者,实现Builder接口,构造和装配各个部件;<br /> Product是具体的产品;<br /> Director是指挥者,用来构建一个使用Builder接口的对象。<br /> 建造者模式主要用于创
2010-11-07 10:11:00 1389 1
原创 设计模式之十二 外观模式-股票基金
<br /> 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。<br /> 其实就是在客户端和一堆子类中间加了一个简单的接口,从而使得客户端不需要知道一些更加细节的东西。充分体现了依赖倒转原则(高层模块不依赖低层模块,它们都依赖于抽象)和迪米特法则(如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用)。<br />
2010-11-01 21:05:00 735
原创 第五章 重构名录
<br /><br />重构名录<br />一、重构的记录格式<br />5-12章介绍了各种重构手法,每个重构手法包含如下5部分:<br />1.名称:<br />2.简短概要:简单介绍此重构手法的适用情景<br />3.动机:介绍为什么需要这个重构和什么情况下不该使用这个重构<br />4.作法:简明扼要地一步一步介绍如何进行此重构<br />5.范例:<br /> <br />二、寻找引用点<br /> 文本工具进行查找<br />三、这些重构准则有多成熟<br /> 重构的基本技巧-小步前
2010-11-01 15:06:00 653
原创 第四章 构筑测试体系
自我测试代码(Self-testing Code)的价值 如果认真观察程序员把最多时间耗在哪里,你就会发现,编写代码其实只占非常小的一部分。 确保所有测试都完全自动化,让它们检查自己的测试结构。 只要写好一点功能就添加测试。 一整组(a suite of)测试就是一个强大的臭虫侦测器,能够大大所见查找臭虫所需要的时间。 实际上,撰写测试代码的最有用时机是在开始编程之前。当你需要添加特性的时候,先写相应测试代码。编写测试代码就是在问自己,添加这个功能需要做些什么。编写测试代码还能使你把注意力集
2010-11-01 15:04:00 562
自定义TreeListCtrl
2013-11-27
调试跟踪工具OllyDbg+1.09中文版
2013-02-27
swiEditor相关资料
2011-09-02
程序皮肤文件,使用方法及实例
2011-01-06
托盘图标的制作,双击托盘图标重新打开窗口,点击托盘图标右键可以选择是打开窗口还是退出程序
2010-05-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人