C++编程风格培训共60张课件_第1页
C++编程风格培训共60张课件_第2页
C++编程风格培训共60张课件_第3页
C++编程风格培训共60张课件_第4页
C++编程风格培训共60张课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+编程风格培训东信北邮信息技术有限公司C+编程风格培训东信北邮信息技术有限公司培训目的熟练掌握基本的C+编程规范正确使用C+语言的特性了解一些基本的C+的编程技巧培训目的熟练掌握基本的C+编程规范内容简介文件结构程序版式基本命名规则表达式和基本语句函数设计内存管理C+的特性其他的一些注意事项内容简介文件结构文件结构文件结构基本概念(文件结构 )每个C+/C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。C+/C程序的头文件以“.h”或“.hpp”为后缀,

2、C程序的定义文件以“.c”为后缀,C+程序的定义文件通常以“.C”为后缀(也有一些系统以”.cpp”,“”或“.cxx”为后缀)。基本概念(文件结构 )版权和版本申明(文件结构)/* * Copyright(C) 2000 EASTCOM-BUPT Inc. * * Filename : smapcommand.h * Description : header file of smapcommand.C * * Author : Li Wei * * History : 2000-07-24 Created * */版权和版本申明(文件结构)/*头文件的结构(文件结构)为了防止头文件被重复引用

3、,应当用ifndef/define/endif结构产生预处理块。用 #include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。 用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。 头文件中只存放“声明”而不存放“定义” 不提倡使用全局变量。 头文件的结构(文件结构)为了防止头文件被重复引用,应当用if定义文件的结构(文件结构)#ifndefGRAPHICS_H/ 防止graphics.h被重复引用#defineGRAPHICS_H#include / 引用标准库的头文件#include “myheader.h” /

4、 引用非标准库的头文件void Function1();/ 全局函数声明class Box / 类结构声明;#endif定义文件的结构(文件结构)#ifndefGRAPHICS_目录结构 如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维护。例如可将头文件保存于include目录,将定义文件保存于source目录(可以是多级目录)。 如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。 目录结构 如果一个软件的头文件数目比较多(如超过十个),通常程序版式

5、 程序版式 空行 (程序版式)在每个类声明之后、每个函数定义结束之后都要加空行 。在一个函数体内,逻辑上密切相关的语句之间不加空行,其它地方应加空行分隔 。空行 (程序版式)在每个类声明之后、每个函数定义结束之后都要空行 (程序版式)/ 空行void Function1() / 空行void Function2() / 空行void Function3() 空行 (程序版式)/ 空行空行 (程序版式)/ 空行while (condition)statement1;/ 空行if (condition) statement2;elsestatement3;/ 空行statement4; 空行 (程

6、序版式)/ 空行代码行 (程序版式)一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。 if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加。这样可以防止书写失误。 尽可能在定义变量的同时初始化该变量 代码行 (程序版式)一行代码只做一件事情,如只定义一个变量,代码行 (程序版式)/风格一if (width height) dosomething();/风格二if (width =variable12) & (variable3 = variable14) & (variable5 =var缩进(程序版式)不要

7、使用TAB键,最好使用4个空格作为缩进缩进(程序版式)不要使用TAB键,最好使用4个空格作为缩进注释(程序版式)边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。 注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。 如果代码本来就是清楚的,则不必加注释。否则多此一举,令人厌烦。比如:j+; / 大家注意啦:j的值加一啦注释(程序版式)边写代码边注释,修改代码同时修改相应的注释,注释(程序版式)函数的注释,应该可以尽量清晰的说明函数的功能,输入输出参数。比如:/*-*/* 函数名称:operatorLogin */* 功能描述:处理

8、操作员登陆 */* 参数说明: */*data:操作员登陆的命令对象指针 */* 返回值: */* 备注: */*-*/void operatorLogin(ScDataType *data)注释(程序版式)函数的注释,应该可以尽量清晰的说明函数的功能注释(程序版式)修改注释,应该用简洁的语言说明修改人(全名),修改时间和修改目的。比如:/age=23/ lugang,2019-07-07/ 因为过去了一年,所以该参数值加一age=24注释(程序版式)修改注释,应该用简洁的语言说明修改人(全名)类的版式 (程序版式)将public类型的函数写在前面,而将private类型的数据写在后面 。类的

9、版式 (程序版式)将public类型的函数写在前面,而将类的版式 (程序版式)class A public: void Func1(void); void Func2(void); protected: int h; private: int i, j; float x, y; 类的版式 (程序版式)class A命名规则 命名规则 命名规则标识符应当直观且可以拼读命名规则尽量与所采用的操作系统或开发工具的风格保持一致。 程序中不要出现仅靠大小写区分的相似的标识符。 void foo(int x);/ 函数foo 与FOO容易混淆void FOO(float x); 命名规则标识符应当直观且可

10、以拼读命名规则程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。 如果标识符有多个单词组成,每个单词的第一个字母应大写(首单词除外),如果是缩写则缩写的第一个字母大写,其余的小写。比如:int oldValueCode;int oldHlrCode;/HLR是缩写命名规则程序中不要出现标识符完全相同的局部变量和全局变量,尽命名规则变量的名字应当使用“名词”或者“形容词名词”。 float value;float oldValue;全局函数的名字应当使用“动词”或者“动词名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对

11、象本身。 drawBox();/ 全局函数box-draw();/ 类的成员函数命名规则变量的名字应当使用“名词”或者“形容词名词”。 命名规则类名用大写字母开头的单词组合而成。例如:class Node;/ 类名class LeafNode;/ 类名函数名用小写字母开头的单词组合而成。void draw(void);/ 函数名void setValue(int value);/ 函数名 命名规则类名用大写字母开头的单词组合而成。命名规则变量和参数用小写字母开头的单词组合而成。例如:BOOL flag;int drawMode; 常量全用大写的字母,用下划线分割单词。例如:const int

12、MAX = 100;const int MAX_LENGTH = 100; 命名规则变量和参数用小写字母开头的单词组合而成。命名规则静态变量加前缀s_(表示static)。 如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。 类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。 命名规则静态变量加前缀s_(表示static)。 表达式和基本语句 表达式和基本语句 if 语句 (表达式和基本语句 )不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。 if (flag)/ 表示flag为真if (!flag)/ 表示flag为假if 语

13、句 (表达式和基本语句 )不可将布尔变量直接与TRUif 语句 (表达式和基本语句 )应当将整型变量用“=”或“!=”直接与0比较。 假设整型变量的名字为value,它与零值比较的标准if语句如下:if (value = 0) if (value != 0)不可模仿布尔变量的风格而写成if (value)/ 会让人误解 value是布尔变量if (!value)if 语句 (表达式和基本语句 )应当将整型变量用“=”或if 语句 (表达式和基本语句 )不可将浮点变量用“=”或“!=”与任何数字比较,应该设法转化成“=”或“=-EPSINON) & (x=EPSINON)其中EPSINON是允许

14、的误差(即精度)。 if 语句 (表达式和基本语句 )不可将浮点变量用“=”或if 语句 (表达式和基本语句 )应当将指针变量用“=”或“!=”与NULL比较。 比如:char *p=NULL;if (p!=NULL) delete p;if 语句 (表达式和基本语句 )应当将指针变量用“=”或switch语句(表达式和基本语句 ) 每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。 不要忘记最后那个default分支。即使程序真的不需要default处理,也应该保留语句switch语句(表达式和基本语句 ) 每个case语句的结switch语句(表

15、达式和基本语句 ) int value;.switch (value) 1:break; 2: . . default :switch语句(表达式和基本语句 ) int va函数设计函数设计参数的设计(函数设计)一个函数的代码短的行数不应该超过80行,如果超过了,这个函数的设计存在一定问题。 避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。 参数的设计(函数设计)一个函数的代码短的行数不应该超过80行返回值的规则 (函数设计)不要省略返回值的类型。 不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。 返

16、回值的规则 (函数设计)不要省略返回值的类型。 内存管理内存管理从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。内存分配方式(内存管理)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内常见的内存错误及其对策 用malloc或new申请内存之后,应该立即检查指针值是否

17、为NULL。防止使用指针值为NULL的内存。 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。常见的内存错误及其对策 用malloc或new申请内存之后,常见的内存错误及其对策动态内存的申请与释放必须配对,防止内存泄漏。 用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。new和 delete,以及malloc和free必须配套使用,不可混用。如果对一个空指针进行free或delete操作,系统不会报错,程序也不会异常终止。常见的内存错误及其对策动态内存的申请与释放必须配对

18、,防止内存常见的内存错误及其对策内存拷贝函数memcpy要慎用比如:char str210=“hello lg”;char str16;int i=1;memcpy(str1,str2,10);常见的内存错误及其对策内存拷贝函数memcpy要慎用动态内存会被自动释放吗? void Func(void)char *p = (char *) malloc(100);/ 动态内存会自动释放吗?动态内存会被自动释放吗? void Func(void)内存耗尽怎么办? 判断指针是否为NULL,如果是则马上用return语句终止本函数。 判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运

19、行。 为new和malloc设置异常处理函数。 例如可以用set_new_hander函数 内存耗尽怎么办? 判断指针是否为NULL,如果是则马上用reC+的特性 C+的特性 类的构造和析构函数类的成员变量初始化应该尽量放在构造函数中进行;类的析构函数中应该释放所有在该类的中分配的动态内存;类的构造和析构函数类的成员变量初始化应该尽量放在构造函数中进类的构造和析构函数比如:ClassA的declaration如下:class ClassApublic:ClassA();ClassA();private:int distrubutr1;bool ifInitial;char *buffer;;类的构造和析构函数比如:ClassA的declaration类的构造和析构函数ClassA的definition如下:ClassA:ClassA() distrubutr1=0; ifInitial=true;p=NULL;ClassA:ClassA() delete buffer;类的构造和析构函数ClassA的definition如下:其他特性函数和运算符重载OverrideInline的使用拷贝构造函数继承和组合Const的使用其他特

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论