C++编程高质量培训.pdf
《C++编程高质量培训.pdf》由会员分享,可在线阅读,更多相关《C++编程高质量培训.pdf(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、vv Back to man.ChinaU高质量C+/C编程指南文件状态1 草稿文件 J 正式文件口更改正式文件文件标识:当前版本:1.0作者:林锐博士完成日期:2001年7月24日版 本 历 史版本/状态作者参与者起止日期备注V0.9草稿文件林锐2001-7-1S2001-7-18林锐起草V 1.0正式文件林锐2001-7-18S2001-7-24朱洪海审查V 0.9,林锐修正草稿中的错误目录前 言.第1章文件结构.1.1 版权和版本的声明1.2 头文件的结构.1.3 定义文件的结构.1.4 头文件的作用.1.5 目录结构第2章程序的版式2.1 空行2.2 代码行2.3 代码行内的空格2.4
2、 对齐2.5 长行拆分2.6 修饰符的俅置2.7 注释.2.8 类的版式.第3章命名规则.3.1 共性规则3.2 简单的WINDOWS应用程序命名规则3.3 简单的U N IX应用程序命名规则第4章表达式和基本语句.4.1 运算符的优先级4.2 复合表达式4.3 IF 语句.4.4 循环语句的效率.4.5 FOR语句的循环控制变量4.6 SW ITCH语句4.7 GOTO语句第5章 常 量.5.1 为什么需要常量5.2 CONST与#DEF1NE的比较5.3 常量定义规则.5.4 类中的常量第6章函数设计.6.1 参数的规则6.2 返|可值的规则6.3 函数内部实现的规则6.4 其它建议6.5
3、 使用断言6.6 引用与指针的比较第7章内存管理.7.1 内存分配方式.7.2 常见的内存错误及其对策7.3 指针与数组的对比7.4 指针参数是如何传递内存的?7.5 FREE和 DELETE把指针-怎么啦?.7.6 动态内存会被自动释放吗?.7.7 杜 绝“野指针”.7.8 有了 MALLOC/FREE 为什么还要 NEW/DELETE?.7.9 内存耗尽怎么办?7.10 MALLOC/FREE的使用要点7.11 NEW/DELETE 的使用要点.7.12 一些心得体会第8章C+函数的高级特性.8.1 函数重载的概念.8.2 成员函数的而载、覆盖与隐藏8.3 参数的缺省值.8.4 运算符重载
4、8.5 函数内联8.6 一些心得体会.第9章类的构造函数、析构函数与赋值函数.9.1 构造函数与析构函数的起源.9.2 构造函数的初始化表9.3 构造和析构的次序9.4 示例:类 STRING的构造函数与析构函数9.5 不要轻视拷贝构造函数名赋值函数9.6 示例:类 STRING的拷贝构造函数与赋值函数.9.7 偷懒的办法处理拷贝构造函数与赋值函数9.8 如何在派生类中实现类的基本函数.9 9 些心得体会.第10章类的继承与组合.10.1 继承10.2 组合第11章其它编程经验.CONST提高函数的健壮性11.2 提高程序的效率II.3 一些有益的建议参考文献附录A:C+/C代码审查表附录B:
5、C+/C试题.附录C:C+/C试题的答案与评分标准.二、本书导读首先请做附录B的C+/C试题(不要看答案),考查自己的编程质量究竟如何。然后参照答案严格打分。(1)如果你只得了几十分,请不要声张,也不要太难过。编程质量差往往是由于不良习惯造成的,与人的智力、能力没有多大关系,还是有药可救的。成绩越差,可以进步的空间就越大,中国不就是在落后中赶超发达资本主义国家吗?只要你能下决心改掉不良的编程习惯,第二次考试就能及格了。(2)如果你考及格了,表明你的技术基础不错,希望你能虚心学习、不断进步。如果你还没有找到合适的工作单位,不妨到上海贝尔试一试。(3)如果你考出8 5分以上的好成绩,你有义务和资格
6、为你所在的团队作“C+/C编程”培训I。希望你能和我们多多交流、相互促进。半年前我曾经发现一颗好苗子,就把他挖到我们小组来。(4)如果你在没有任何提示的情况下考了满分,希望你能收我做你的徒弟。编程考试结束后,请阅读本书的正文。本书第一章至第六章主要论述C+/C编程风格。难度不高,但是细节比较多。别小看了,提高质量就是要从这些点点滴滴做起。世上不存在最好的编程风格,一切因需求而定。团队开发讲究风格一致,如果制定了大家认可的编程风格,那么所有组员都要遵守。如果读者觉得本书的编程风格比较合你的工作,那么就采用它,不要只看不做。人在小时候说话发音不准,写字潦草,如果不改正,总有后悔的时候。编程也是同样
7、道理。第七章至第十一章是专题论述,技术难度比较高,看书时要积极思考。特别是第七章“内存管理”,读了并不表示懂了,懂了并不表示就能正确使用。有一位同事看了第七章后觉得“野指针”写得不错,与我切磋了一把。可是过了两周,他告诉我,他忙了两天追查出一个B u g,想不到又是“野指针”出问题,只好重读第七章。光看本书对提高编程质量是有限的,建议大家阅读本书的参考文献,那些都是经典名著。如果你的编程质量已经过关了,不要就此满足。如果你想成为优秀的软件开发人员,建议你阅读并按照CMMI规范做事,让自己的综合水平上升一个台阶。上海贝尔的员工可以向网络应用事业部软件工程研究小组索取CMMI有关资料,最好能参加培
8、训。三、版权声明本书的大部分内容取材于作者一年前的书籍手稿(尚未出版),现整理汇编成为上海贝尔网络应用事业部的一个规范化文件,同时作为培训教材。由于C+/C编程是众所周知的技术,没有秘密可言。编程的好经验应该大家共享,我们自己也是这么学来的。作者愿意公开本书的电子文档。版权声明如下:(1)读者可以任意拷贝、修改本书的内容,但不可以篡改作者及所属单位。(2)未经作者许可,不得出版或大量印发本书。(3)如果竞争对手公司的员工得到本书,请勿公开使用,以免发生纠纷。预计到2002年7月,我们将建立切合中国国情的CMMI 3级解决方案。届时,包括本书在内的约1000页规范将严格受控。欢迎读者对本书提出批
9、评建议。林锐,2001年7月第1章文件结构每 个 C+/C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。C+/C程序的头文件以“.h”为后缀,C 程序的定义文件以“.c”为后缀,C+程序的定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。L1版权和版本的声明版权和版本的声明位于头文件和定义文件的开头(参见示例i-i),主要内容有:(1)版权信息。(2)文件名称,标识符,摘要。(3)当前版本号,作者/修改者,完成日期。(4)
10、版本历史信息。/*Copyright(c)2001,上海贝尔有限公司网络应用事业部*All rights reserved.*文件名称:filename,h*文件标识:见配置管理计划书*摘 要:简要描述本文件的内容*当前版本:1.1*作 者:输入作者(或修改者)名字*完成H期:2001 年7 月20日*取代版本:1.()*原 作 者:输入原作者(或修改者)名字*完成日期:2001 年5 月1 0日*/示例1 T 版权和版本的声明工 工 头文件的结构头文件由三部分内容组成:(1)头文件开头处的版权和版本声明(参见示例1-1)。(2)预处理块。(3)函数和类结构声明等。假设头文件名称为graphi
11、cs,h,头文件的结构参见示例1-2。【规则1-2-1】为了防止头文件被重复引用,应当用ifndeiVdefine/endif结构产生预处理块。【规贝打-2-2】用#in clu d e filenamej 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。【规则1-2-3】m#include“filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。令 【建议1 2 1】头文件中只存放“声明”而不存放“定义”在 C+语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定
12、义与声明分开,不论该函数体有多么小。令【建议1-2-2 不提倡使用全局变量,尽量不要在头文件中出现象extern int value这类声明。版权和版本声明见示例1-1,此处省略。#ifndef GRAPHICS_H 防止 graphics.h 被重复引用tfdefine GRAPHICS_HSinclude 引用标准库的头文件#includemyheader.h 引用非标准库的头文件void Functionl();/全局函数声明class Box 类结构声明ttendif示例1-2 C+/C头文件的结构1宜定义文件的结构定义文件有三部分内容:(1)定义文件开头处的版权和版本声明(参见示例1
13、-1)。(2)对一些头文件的引用。(3)程序的实现体(包括数据和代码)。假设定义文件的名称为graphics,c p p,定义文件的结构参见示例1-3。版权和版本声明见示例1-1,此处省略。#include“graphics.h 引用头文件/全局函数的实现体void Functionl(,)()/类成员函数的实现体void Box:Draw()()示例1-3 C+/C定义文件的结构工 盘 头文件的作用早期的编程语言如Basic、Fortran没有头文件的概念,C+/C语言的初学者虽然会用使用头文件,但常常不明其理。这里对头文件的作用略作解释:(1)通过头文件来调用库功能。在很多场合,源代码不便
14、(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。L5目录结构如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维护。例如可将头文件保存于include目录,将定义文件保存于source目 录(可以是多级目录)。如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其
15、“声明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。蜜 章程序的版式版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要构成因素。可以把程序的版式比喻为“书法”。好 的“书法”可让人对程序一目了然,看得兴致勃勃。差的程序“书法”如螃蟹爬行,让人看得索然无味,更令维护者烦恼有加。请程序员们学习程序的“书法”,弥补大学计算机教育的漏洞,实在很有必要。21空行空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。【规则2-1-1
16、在每个类声明之后、每个函数定义结束之后都要加空行。参见示例2-1(a)【规则2-1-2在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。参见示例21(b)示例2-1(a)函数之间的空行 示例2T(b)函数内部的空行/空行/空行void Functionl()w hile(co n d itio n)(.sta te m e n t1;)/空行/空行i f (co n d itio n)void Function2()(sta te m e n t2;)e ls e/空行void Functions(,)sta te m e n ts;()/空行sta te m e n t
17、4;)建 代码行【规则2-2-1】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。【规则2-2-2】if、for、while,d o 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 。这样可以防止书写失误。示例2-2(a)为风格良好的代码行,示例2-2(b)为风格不良的代码行。i n t w i dt h;/宽度i n t he i ght;/高度i n t de p t h;/深度i n t w i dt h,he i ght,de p t h;/宽度高度深度x =a+b;y =c+d;z =e +f;X=a+b;y =c+d;z
18、 =e +f;i f(w i dt h he i ght)(do s o m e t hi n g();)i f(w i dt h virtual、inline、case等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括 号(,以突出关键字。【规则2-3-2】函数名之后不要留空格,紧跟左括号(,以与关键字区别。【规则2-3-31向后紧跟,D、,、向前紧跟,紧跟处不留空格。【规则2-3-4*,之后要留空格,如Functions,y,z)。如 果 不 是 一 行 的 结 束 符 号,其后要留空格,如 for(initialization;c
19、ondition;update)【规则2 3 5 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”=、“=、+”、“*”、“”、“&”、“|、等二元操作符的前后应当加空格。【规则2 3 6】-元操作符如“!”、“+”、“一”、“&”(地址运算符)等前后不加空格。【规贝112-3-7】象“口”、这类操作符前后不加空格。建议2-3-1】对于表达式比较长的fo r 语句和i f语句,为了紧凑起见可以适当地去掉一些空格,如 fo r (i=0;i 1 0;i+)和 i f(a=2 0 0 0)良好的风格i f(y e ar 2 0 0 0)/不良的风格i f(a=b)&(
20、c=b&c=d)不良的风格fo r (i=0;i 1 0;i+)/良好的风格fo r(i=0;i 1 0;i+)/不良的风格fo r (i =0;I 1 0;i +)过多的空格x =a b?a:b;/良好的风格x=a Fu n ct i o n ();/不要写成 b-Fu n ct i o n();示例2-3 代码行内的空格刿对齐【规则2-4-1】程序的分界符 和 应独占一行并且位于同一列,同时与引用它们的语句左对齐。【规则2-4-2 之内的代码块在 右边数格处左对齐。示例2 4 (a)为风格良好的对齐,示例2-4 (b)为风格不良的对齐。void Function(int x)void Fu
21、nction(int x)/program code/program code)if(condition)if(condition)/program code/program code)else()else /program code)示例2-4(a)风格良好的对齐 示例2-4(b)风格不良的对齐/program code)for(initialization;condition;update)(/program code)for(initialization;condition;update)/program code)While(condition)(/program code)while
22、(condition)/program code如果出现嵌套的,则使用缩进对齐,如:(会 长 行拆分【规则251】代码行最大长度宜控制在70 至8 0 个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。【规则2 5-2长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。if (ve ry_ longe r_ va ria b 1 e 1 =ve ry_ longe r_ va ria b le l2)&(ve ry_ longe r_ va ria b le 3 =ve ry_ longe r_ va ri
23、a b le 1 4)&(ve ry_ longe r va ria b le s DrawO;类的成员函数【规则3-1-8 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。例如:int minValue;int maxValue;int SetValue(.);int GetValue(.);。【建议3-1-1】尽量避免名字中出现数字编号,如 Valuel,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。3.2简单的Windows应用程序命名规则作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单
24、易用,比较适合于Windows应用软件的开发。【规则3-2-1】类名和函数名用大写字母开头的单词组合而成。例如:class Node;/类名class LeafNode;/类名void Draw(void);/函数名void SetValue(int value);/函数名【规则322】变量和参数用小写字母开头的单词组合而成。例如:BOOL flag;int drawMode;【规则3-2-3】常量全用大写的字母,用下划线分割单词。例如:const int MAX=100;const int MAX LENGTH=100;【规则3-2-4静态变量加前缀$_ (表示static)。例如:void
25、 Init(.)(static int s_i nit Value;静态变量)【规则3-2-5如果不得已需要全局变量,则使全局变量加前缀(表示global)。例如:int g_howManyPeople;/全局变量int g_howMuchMoney;全局变量【规则3 2 6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。例如:void Object:SetValue(int width,int height)(m_width=width;m_height=height:【规则3-2-7为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 编程 质量 培训
限制150内