【文档说明】C++编程风格培训共60张课件.ppt,共(60)页,390.000 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44701.html
以下为本文档部分文字说明:
C++编程风格培训东信北邮信息技术有限公司培训目的熟练掌握基本的C++编程规范正确使用C++语言的特性了解一些基本的C++的编程技巧内容简介文件结构程序版式基本命名规则表达式和基本语句函数设计内存管理C++的特性
其他的一些注意事项文件结构基本概念(文件结构)每个C++/C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定
义(definition)文件。C++/C程序的头文件以“.h”或“.hpp”为后缀,C程序的定义文件以“.c”为后缀,C++程序的定义文件通常以“.C”为后缀(也有一些系统以”.cpp”,“”或“.c
xx”为后缀)。版权和版本申明(文件结构)/**Copyright(C)2000EASTCOM-BUPTInc.**Filename:smapcommand.h*Description:headerfileofs
mapcommand.C**Author:LiWei**History:2000-07-24Created**/头文件的结构(文件结构)为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。用#include<filename.h>格式来引用标准库
的头文件(编译器将从标准库目录开始搜索)。用#include“filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。头文件中只存放“声明”而不存放“定义”不提倡使用全局变量。定义文件的结构(文件结构)#ifndefGRAPHICS_H//防止grap
hics.h被重复引用#defineGRAPHICS_H#include<math.h>//引用标准库的头文件…#include“myheader.h”//引用非标准库的头文件…voidFunction1(…);//全局函
数声明…classBox//类结构声明{…};#endif目录结构如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维护。例如可将头文件保存于include目录,将定义文件保存于so
urce目录(可以是多级目录)。如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。程序版式空行(程序版式)在每个类声明之后、每个函数定义结束之后都要加空行。在一个
函数体内,逻辑上密切相关的语句之间不加空行,其它地方应加空行分隔。空行(程序版式)//空行voidFunction1(…){…}//空行voidFunction2(…){…}//空行voidFunction3(…){…}空行(程序版式)//空行while(condition){statement
1;//空行if(condition){statement2;}else{statement3;}//空行statement4;}代码行(程序版式)一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码
容易阅读,并且方便于写注释。if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。尽可能在定义变量的同时初始化该变量代码行(程序版式)//风格一if(width<height){dosomethin
g();}//风格二if(width<height){dosomething();}intwidth=10;//定义并初绐化width长行拆分(程序版式)代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。长表达式要
在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。长行拆分(程序版式)if((variable1>=variable12)&&(variable3<=variable14)&&(variable5<=varia
ble16)){dosomething();}缩进(程序版式)不要使用TAB键,最好使用4个空格作为缩进注释(程序版式)边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释
要删除。注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。如果代码本来就是清楚的,则不必加注释。否则多此一举,令人厌烦。比如:j++;//大家注意啦:j的值加一啦注释(程序版式)函数的注释,应该可以尽量清晰的说明函数的功能,
输入输出参数。比如:/*--------------------------------------------------------------*//*函数名称:operatorLogin*//*功能描述:处理操作员登陆*//*参数说明:*//*data:操作员登陆的命令对象指针*/
/*返回值:*//*备注:*//*--------------------------------------------------------------*/voidoperatorLogin(ScDat
aType*data)注释(程序版式)修改注释,应该用简洁的语言说明修改人(全名),修改时间和修改目的。比如://age=23//lugang,2019-07-07//因为过去了一年,所以该参数值加一age=24类的版式(程序版式)将public类型的函数
写在前面,而将private类型的数据写在后面。类的版式(程序版式)classA{public:voidFunc1(void);voidFunc2(void);…protected:inth;…private:inti,j;
floatx,y;…}命名规则命名规则标识符应当直观且可以拼读命名规则尽量与所采用的操作系统或开发工具的风格保持一致。程序中不要出现仅靠大小写区分的相似的标识符。voidfoo(intx);//函数f
oo与FOO容易混淆voidFOO(floatx);命名规则程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。如果标识符有多个单词组成,每个单词的第一个字母应大写(首单词除外),如果是缩写则
缩写的第一个字母大写,其余的小写。比如:intoldValueCode;intoldHlrCode;//HLR是缩写命名规则变量的名字应当使用“名词”或者“形容词+名词”。floatvalue;floatoldValue;全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成
员函数应当只使用“动词”,被省略掉的名词就是对象本身。drawBox();//全局函数box->draw();//类的成员函数命名规则类名用大写字母开头的单词组合而成。例如:classNode;//类名classLeafN
ode;//类名函数名用小写字母开头的单词组合而成。voiddraw(void);//函数名voidsetValue(intvalue);//函数名命名规则变量和参数用小写字母开头的单词组合而成。例如:BOOLflag;intdrawMode;常量全用大写的字母,用下划线分割单词。例如:c
onstintMAX=100;constintMAX_LENGTH=100;命名规则静态变量加前缀s_(表示static)。如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。类的数据成员加前缀m_(表示member),这样可以避免数据成员与
成员函数的参数同名。表达式和基本语句if语句(表达式和基本语句)不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。if(flag)//表示flag为真if(!flag)//表示flag为假if语句(表达式和基本语句)应当将整型变量用“==”或“!=”直接与0比较。假设整型变
量的名字为value,它与零值比较的标准if语句如下:if(value==0)if(value!=0)不可模仿布尔变量的风格而写成if(value)//会让人误解value是布尔变量if(!value)if语句(表达式和基本语句)不可将浮点变量用“=
=”或“!=”与任何数字比较,应该设法转化成“>=”或“<=”形式。假设浮点变量的名字为x,应当将if(x==0.0)//隐含错误的比较转化为if((x>=-EPSINON)&&(x<=EPSINON))其中EPSINON是允许的误差(即精度)。if语句(表达式和基本语句)应当将
指针变量用“==”或“!=”与NULL比较。比如:char*p=NULL;…if(p!=NULL)deletep;switch语句(表达式和基本语句)每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。不要忘记最后那个defa
ult分支。即使程序真的不需要default处理,也应该保留语句switch语句(表达式和基本语句)intvalue;….switch(value){1:…break;2:..default:…}函数设计参数的设计(函
数设计)一个函数的代码短的行数不应该超过80行,如果超过了,这个函数的设计存在一定问题。避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。返回值的规则(函数设计)不要省略返回值的类型。不要将正常值和错误标志混在
一起返回。正常值用输出参数获得,而错误标志用return语句返回。内存管理•从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。•在栈上创建。在执行函数时,函数内局部变量的
存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。•从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。内
存分配方式(内存管理)常见的内存错误及其对策用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。避免数组或指针的下标越界,特别要当心发生“多1”或者“少
1”操作。常见的内存错误及其对策动态内存的申请与释放必须配对,防止内存泄漏。用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。new和delete,以及malloc和free必须配套使用,不可混用。如果对
一个空指针进行free或delete操作,系统不会报错,程序也不会异常终止。常见的内存错误及其对策内存拷贝函数memcpy要慎用比如:charstr2[10]=“hellolg”;charstr1[6];inti=1;…memcpy(str1,str2,10);动态内存会被自动释放吗?voi
dFunc(void){char*p=(char*)malloc(100);//动态内存会自动释放吗?}内存耗尽怎么办?判断指针是否为NULL,如果是则马上用return语句终止本函数。判断指针是否为NU
LL,如果是则马上用exit(1)终止整个程序的运行。为new和malloc设置异常处理函数。例如可以用set_new_hander函数C++的特性类的构造和析构函数类的成员变量初始化应该尽量放在构造函数中进行;类的析构函数中应该释放所有在该类的中分配的动态内存;类的构造和析构函数比如
:ClassA的declaration如下:classClassA{public:ClassA();~ClassA();…private:intdistrubutr1;boolifInitial;char*buffer;…};类的构造和析构函数ClassA的definition如下:Cl
assA::ClassA(){distrubutr1=0;ifInitial=true;p=NULL;}ClassA::~ClassA(){deletebuffer;}其他特性函数和运算符重载OverrideInline的使用
拷贝构造函数继承和组合Const的使用其他的一些注意事项其他的一些注意事项当心那些视觉上不易分辨的操作符发生书写错误。我们经常会把“==”误写成“=”,象“||”、“&&”、“<=”、“>=”这类符号也很容易发生“丢1”失误。然而编译器却不一定能
自动指出这类错误。变量(指针、数组)被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。其他的一些注意事项当心数据类型转换发生错误。尽量使用显式的数据类型转换(让人们知道发生了什么事),避免让
编译器轻悄悄地进行隐式的数据类型转换。当心变量发生上溢或下溢,数组的下标越界。当心忘记编写错误处理程序,当心错误处理程序本身有误。其他的一些注意事项避免编写技巧性很高代码。不要设计面面俱到、非常灵活的数据结构。如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的
代码,应当重新编写。如果你是对于其他人编写的代码进行修改,应该尽量按照原有的代码编写风格修改代码。推荐网址csdncplus.aboutwlbookwl.myricegnu.org有一些有用的书籍和源码推荐书籍和工具推荐C++源码的阅读工具So
urceInsight推荐书籍:《高质量C++编程指南》《C++编程思想》谢谢问题?我的信箱:lugangebupt谢谢!