1、精选12一一定定要要编编写写人人品品:代代码码是是写写给给他他人人用用的的!养养成成好好习习惯惯从从点点点点滴滴滴滴做做起起不不要要光光看看不不做做3程程序序员员程程老老手手:能能够够长长期期稳稳定定地地编编写写出出高高质质量量程程序序的的程程序序员员什什么么是是编编程程高高手手:能能够够长长期期稳稳定定地地编编写写出出高高难难度度、高高质质量量程程序序的的程程序序员员4编编程程定定团团队队开开发发讲讲究究风风格格一一致致如如果果制制定定了了大大家家认认可可的的编编程程风风格格,那那么么所所有有组组员员都都要要遵遵守守若若某某种种编编程程风风格格比比较较合合你你的的工工作作,那那么么就就采采用
2、用它它,不不要要只只看看不不做做:养养成成习习惯惯!5一流一流代码代码6关关于于代代码码7程程序序8程程序序9程程序序10程程序序1112程程序序13程程序序14程程序序15程程序序1617程程序序1819程程序序20程程序序21注注释释22注注释释23注注释释24注注释释25注注释释26注注释释27注注释释28注注释释29注注释释30注注释释31注注释释32注注释释33注注释释34Readm35类类的的36标标识识符符37标标识识符符命命名名38标标识识符符命命名名39Windows40Windows41简简化化的的Window42灵灵活活运运用用43表表达达44无无需需背背45需需要要考考
3、虑虑移移46与与零零比比47与与零零比比48与与零零比比49与与零零比比50常常量量51常常量量52常常量量53常常量量54常常量量55动动态态56函函数数设设57函函数数设设58函函数数设设59函函数数设设60成成对对61其其试试构构造造尽尽可可能能多多的的数数据据,变变态态的的数数据据Code review让让别别人人看看你你的的代代码码多多看看别别人人(高高手手)的的代代码码处处理理错错误误机机制制返返回回错错误误信信息息异异常常处处理理活活用用断断言言ASSERT(),在在debug版版本本多多用用,能能发发现现很很多多隐隐含含的的bugs精选62635.1 内内就就已已经经分分配配好
4、好,这这块块内内存存在在程程序序的的整整个个运运行行期期间间都都存存在在。例例如如全全局局变变量量,static变变量量。在在栈栈上上创创建建。在在执执行行函函数数时时,函函数数内内局局部部变变量量的的存存储储单单元元都都可可以以在在栈栈上上创创建建,函函数数执执行行结结束束时时这这些些存存储储单单元元自自动动被被释释放放。栈栈内内存存分分配配运运算算内内置置于于处处理理器器的的指指令令集集中中,效效率率很很高高,但但是是分分配配的的内内存存容容量量有有限限。从从堆堆上上分分配配,亦亦称称动动态态内内存存分分配配。程程序序在在运运行行的的时时候候用用malloc或或new申申请请任任意意多多少
5、少的的内内存存,程程序序员员自自己己负负责责在在何何时时用用free或或delete释释放放内内存存。动动态态内内存存的的生生存存期期由由我我们们决决定定,使使用用非非常常灵灵活活,但但问问题题也也最最多多。645.2 常常见见配配虽虽然然成成功功,但但是是尚尚未未初初始始化化就就引引用用它它。内内存存分分配配成成功功并并且且已已经经初初始始化化,但但操操作作越越过过了了内内存存的的边边界界。忘忘记记了了释释放放内内存存,造造成成内内存存泄泄漏漏。释释放放了了内内存存却却继继续续使使用用它它655.3 该该立立即即检检查查指指针针值值是是否否为为NULL。防防止止使使用用指指针针值值为为NUL
6、L的的内内存存。不不要要忘忘记记为为数数组组和和动动态态内内存存赋赋初初值值。防防止止将将未未被被初初始始化化的的内内存存作作为为右右值值使使用用。避避免免数数组组或或指指针针的的下下标标越越界界,特特别别要要当当心心发发生生“多多1”或或者者“少少1”操操作作。动动态态内内存存的的申申请请与与释释放放必必须须配配对对,防防止止内内存存泄泄漏漏。用用free或或delete释释放放了了内内存存之之后后,立立即即将将指指针针设设置置为为NULL,防防止止产产生生“野野指指针针”。665.4 free 和和有有把把指指针针本本身身干干掉掉。指指针针p被被free以以后后其其地地址址仍仍然然不不变变
7、(非非NULL),只只是是该该地地址址对对应应的的内内存存是是垃垃圾圾,p成成了了“野野指指针针”。如如果果此此时时不不把把p设设置置为为NULL,会会让让人人误误以以为为p是是个个合合法法的的指指针针。如如果果程程序序比比较较长长,我我们们有有时时记记不不住住p所所指指的的内内存存是是否否已已经经被被释释放放,在在继继续续使使用用p之之前前,通通常常会会用用语语句句if(p!=NULL)进进行行防防错错处处理理。很很遗遗憾憾,此此时时if语语句句起起不不到到防防错错作作用用,因因为为即即便便p不不是是NULL指指针针,它它也也不不指指向向合合法法的的内内存存块块。“野野指指针针”示示例例67
8、5.5 动动态态内内存存所所指指的的内内存存会会被被自自动动释释放放。内内存存被被释释放放了了,并并不不表表示示指指针针会会消消亡亡或或者者成成了了NULL指指针针。685.6 杜杜圾圾”内内存存的的指指针针。人人们们一一般般不不会会错错用用NULL指指针针,因因为为用用if语语句句很很容容易易判判断断。但但是是“野野指指针针”是是很很危危险险的的,if语语句句对对它它不不起起作作用用。“野野指指针针”的的成成因因主主要要有有三三种种:指指针针变变量量没没有有被被初初始始化化。任任何何指指针针变变量量刚刚被被创创建建时时不不会会自自动动成成为为NULL指指针针,它它的的默默认认值值是是随随机机
9、的的,它它会会乱乱指指一一气气。指指针针p被被free或或者者delete之之后后,没没有有置置为为NULL,让让人人误误以以为为p是是个个合合法法的的指指针针。指指针针操操作作超超越越了了变变量量的的作作用用范范围围。这这种种情情况况让让人人防防不不胜胜防防69705.7 newew/delete是是运运算算符符。光光用用maloc/free无无法法满满足足动动态态对对象象的的要要求求。对对象象在在创创建建的的同同时时要要自自动动执执行行构构造造函函数数,对对象象在在消消亡亡之之前前要要自自动动执执行行析析构构函函数数。由由于于malloc/free是是库库函函数数而而不不是是运运算算符符,
10、不不在在编编译译器器控控制制权权限限之之内内,不不能能够够把把执执行行构构造造函函数数和和析析构构函函数数的的任任务务强强加加于于malloc/free。因因此此C+语语言言需需要要一一个个能能完完成成动动态态内内存存分分配配和和初初始始化化工工作作的的运运算算符符new,以以及及一一个个能能完完成成清清理理与与释释放放内内存存工工作作的的运运算算符符delete。71new 和和d恰恰当当的的一一块块内内存存若若是是对对象象,调调用用相相应应类类的的构构造造函函数数,并并以以刚刚申申请请的的内内存存地地址址作作为为this参参数数调调用用delete所所包包含含的的动动作作若若是是对对象象,
11、调调用用相相应应类类的的析析构构函函数数将将该该内内存存块块返返回回给给系系统统堆堆72new 和和d容容纳纳n个个对对象象外外加加一一个个整整型型的的一一块块连续内内存存将将n记记录录在在额额外外的的那那个个整整型型内内存存中中调调用用n次次构构造造函函数数初初始始化化这这块块内内存存中中的的n个个连连续续对对象象调调用用delete所所包包含含的的动动作作从从new记记录录n的的地地方方将将n值值找找出出调调用用n次次析析构构函函数数析析构构这这块块内内存存中中的的n个个连连续续对对象象将将这这一一整整块块内内存存(包包括括记记录录n的的整整型型)归归还还系系统统堆堆73有有关关内内存存的
12、的74有有关关内内存存的的75有有关关内内存存的的76有有关关内内存存的的77好好习习惯惯大大量量实实践践知知错错就就改改;经经常常温温故故而而知知新新;坚坚持持学学习习,天天天天向向上上78更更多多79参参考考lean Code(编编程程精精粹粹,姜姜静静波波等等译译),电电子子工工业业出出版版社社,1993.H.Sutter and A.Alexandrescu.C+编编程程规规范范101条条规规则则、准准则则与与最最佳佳实实践践Scott Meyers.Effective C+,Addison-Wesley,1992.林林锐锐.高高质质量量C+/C 编编程程指指南南Kinds of coding guidelines.Online.80Happy