版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1-程序版式1丄对齐1.1.1. 程序块要采用缩进风格编写,缩进的空格数为4个。使用vc提供的tab 键对齐。1.1.2. "”和应独占一行并且位于同一列,同时引用他们的语句对齐1.1.3. 之内的代码块在“”右边数格外左对齐例:正确错误void function(int x) / program code)void function(int x) / program codeif (condition)/ program code)else / program codeif (condition)/ program code else / program code )for (in
2、itialization; condition; update) / program code)for (initialization; condition; update) / program code)while (condition)/ program codewhile (condition) / program code如果出现嵌套的,则使用缩进对齐,如: )1.2.空行1.2.1. 每个声明之后,每个函数定义之后要加空行1.2.2. 在一个函数体内,逻辑上密切相关的语句之间不加空行,其它地方应加空 行分隔1.2.3. 变量声明和代码之间加空行1.2.4. 函数返回语句用空行例:/空
3、行void functionl ()while (condition)/空行void function2()statement 1;/空行if (condition)void functionl ()statement2; else/空行void function2()statement3; /空行return statementd 13 代码行1.3.1. 一行代码只做一件事情,如只定义一个变量,或只写一条语句。1.3.2. if for、do、while > case> switch a default等语句自占一行,且 if、for、 do、while等语句的执行语句部分无论
4、多少都要加括号例:示例:风格良好的代码行示例:风格不良的代码行ini width; / 宽度 int height; / 高度 int depth; / 深度int width, height, depth; / 宽度高度深度x = a + b; y = c + d; z = e + f;x = a + b;y 二 c + d; z = e + f;if (width < height)if (width < height) dosomethingo ;tdosomethingo ;for (initialization; condition; update)for (initia
5、lization; condition; update)dosomethingo ;dosomethingo ;/空行other ();other ();1.4.空格1.4.1. 关键字之后要留空格:const, virtual, inline, if, while, for1.4.2. 函数名之后不要留空格1.4.3. “(”向后紧跟向前紧跟1.4.4. “,”后要留空格,z后如果不是一行的结束,后面要留空格145.赋值操作符,比较,算术,逻辑,第二元操作符前后加空格1.4.6. 一元操作符!、+、一、一等前后不加空格1.4.7. 像、一>等前后不加空格例:void fund (int
6、 x, int y, int z); void fund (int x, int y, int z);/良好的风格/不良的风格if (year >= 2000)if(year>=2000)if (a>=b) && (c<=d)if(a>=b&&c<=d)/良好的风格 /不良的风格 /良好的风格 /不良的风格for (i=0; i<10; i+)for(i=0;i<10;i+)for (i = 0; i < 10; i +)/良好的风格/不良的风格/过多的空格x = a < b ? a : b; x=a&
7、lt;b?a:b;/良好的风格/不好的风格int *x 二 &y; int * x 二 & y;/良好的风格/不良的风格array5 = 0; a. function(); b->function();/ 不要写成 array 5 = 0; / 不要写成 a . function();/ 不要写成 b -> function();1.5.长行拆分1.5.1. 代码行最长度宜控制在70到80个字符以内,代码行不宜过长1.52长表达式拆分,应将操作符放在新行之首,拆分出新行要适当缩进,使排 版整齐例:if (very longer variablel >= ver
8、y ionger variablel2)&& (vcry_ionger_variable3 <= very_ionger_variablel4)&& (very longer variable5 <= very ionger variablel6)dosomething();jvirtual cmatrix cmultiplymatrix (cmatrix leftmatrix,cmatrix rightmatrix);for (very longer_i ni t i ali zation; very longer condition; very_
9、1onger_update)dosomethingo ;16修饰的位置1.6.1. 修饰符*和&应靠近变量名:char *name; int *x, y1.7.类的版式1.7.1. 将public写前面,protect在其后,private写后面,以行为中心1.7.2. 变量在函数声明之后1.7.3. 逻辑相关的函数排列在一起 例:class apublic:void funcl (void);void func2(void);空行int i, j; protect:void func3(void);void func4(void);float x, y; private:void f
10、unc5(void);void func6(void);空行string a, b;2 代码注释规则 (范例文件)2.1. 每个文件头2.1.1. 阐述该文件包含的内容2.1.2. 对include的文件要注释2.2. 每个函数的头部2.2.1. 注明函数名称、函数说明、输入参数和返冋值2.3每个类(即头文件)1.1.1. 注明类的用途2.2.2.2. 函数当中需要注释不易明折的地方3.2.1. 算法3.2.2. 设计思想3.2.3. 独到的用处3.3.3.3. 原则4.1.3.3. 注释和代码一样要及时更新4.1.3.4. 注释不是代码的重复4.1.3.5. 全部使用“/”方式注释4.1.3
11、.6. 注释尽量不要单独占一行4.1.3.7. 注释要简洁、明了4.1.3.8. 边写代码边写注释,mfc自带的代码注释不用修改4.1.3.9. 对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声 明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其 上方相邻位置或右方。4.1.3.10. 将注释与其上而的代码用空行隔开/*函数名称:*函数说明: *输入参数:while (.)*返回值:*/ void function(float x, float y, float z) t / end of while ) / end of if4.2.2. 命名规范4.3.2.
12、共性规则4.3.1.2. 不可用汉语拼音,用英文、用词应准确4.3.1.2. 应用大小写混排方式,如 addchild4.3.1.2. 程序中不要出现仅靠大小写区分的相似的标识符4.3.1.2. 程序屮不要出现标识符完全相同的简单变量和全局变量4.3.1.2. 变量名应当使用“名词”或“形容词+名词”,如:float fvalue;float foldvlaue;float fnewvalue;4.3.1.2. 函数名应使用动词或动词+名词,女山void getvalue();4.3.1.2. 用正确的反义词组命名具有互斥定义的变量或相反动作的函数,如:int nminvalue;int nm
13、axvalue;int nsetvalue;int ngetvalue;4.3.1.2. 对于借来的代码,不改变其命名32命名规则4.3.32 类名和函数名用大写字母开头的单词组合而成,女n:class node;class leafnode;void setvalue();4.3.33 变量和参数用小写字母开头的单词组合而成,女n:boof bflag,;int ndrawmode;float fheight;string strtitle;char csource;4.3.34 常量全用大写字母,用下划线分割单词ddd_saf4.3.35 静态变量前加前缀s_,女口:static int
14、snitvalue;4.3.36 如果不得已需要全局变量,全局变量前加前缀g_,如: int g_howmanypeople4.3.37 类的数据成员加前缀m_,如:void objet:set value(int width, int height)m_width=width;m_height=height)4.3.38 适当使用匈牙利命名法4.2.3. 程序规范4.3.3. 语句4.3.1.3. 对运算符很多的情况下,应该使用括号区分运算的顺序 例如:word = (high « 8) | lowif (a | b) && (a & c)优先级运算符结合律
15、()>从左至右从!+(类型)sizeof+ - * &从右至左* / %从左至右高+ -从左至右« »从左至右到<<=>>=从左至右=!=从左至右低&从左至右排a从左至右1从左至右列&&从左至右ii从右至左 从右至左=+= 二 *二 /= %= &二 a= 1= «= »=从左至右42讦语句4.3.1.3. l 布尔变量与零值比较时,不可将布尔变量直接与true、false或者1、0进行比较 假设布尔变量名字为flag,它与零值比较的标准if语句如下:if (flag)/ 表示 fla
16、g 为真if (!flag) 表示 flag 为假其它的用法都属于不良风格,例如:if (flag = true)if (flag = 1 )if (flag 二二 false)if (flag = 0)4.3.3 整型变量与零值比较时,应当将整型变量用或“ !二”直接与0比较 假设整型变量的名字为value,它与零值比较的标准if语句如下:if (value = 0)if (value != 0)不可模仿布尔变量的风格而写成if (value) /会让人误解value是布尔变量 if (!value)4.3.3 浮点变量与零值比较时,不可将浮点变量用或“!二”与任何数字比较千万要留意,无论是
17、float还是double类型的变量,都有精度限制。所以一定要 避免将浮点变量用或“ !二”与数字比较,应该设法转化成“二”或“<二”形式。假设浮点变量的名字为x,应当将if (x = 0. 0)/隐含错误的比较转化为if (x>=-epsin0n) && (x<=epsin0n)其中epsin0n是允许的误差(即精度)。4.3.3 指针变量与零值比较时,应当将指针变量用或“!二”与null比较指针变量的零值是“空”(记为null)。尽管null的值与0相同,但是两者意义不 同。假设指针变量的名字为p,它与零值比较的标准if语句如下:if (p = null)
18、 / p与nui丄显式比较,强调p是指针变量if (p != null)不要写成if(p二二0)/容易让人误解p是整型变量if (p != 0)或者if (p) if (!p)/容易让人误解p是布尔变量4.3.3 程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序 例如:if (condition)return x;return y;改写为if (condition)return x;elsereturn y;或者改写成更加简练的return (condition ? x : y);4.1.3.循环语句4.1.3.1.在多生循环中,如果有可能,应将最长的循环放在最内层
19、,最短的循环放在最外层,以减少cpu跨越循环层的次数 例:for (row=(); row<100; row+)rfor (col=0; col<5; col+ )ifor ( col=0; col<5; col+ )ifor (row=0; row<100; row+)isum = sum + arowjcolj;isum = sum + alrowjcol;4.1.3.2.如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外 面例:for (i=0; i<n; i+)if (condition)if (condition)for (i=0;
20、i<n; i+)dosomething();dosomethingo ;elsedootherthingo ;elsefor (i二0; i<n; i+)1dootherthingo ;4.3.3.5. switch语句的case分支如果不要break,要注释,同时要加default语句 例:switch语句的基本格式是:switch (variable)case valuel :break;case value2 :break;default :break;4.2.常量4.2.1.只使用const常量,不使用宏常量(自定义)4.3.4.1. 需要对外公开的常量放在头文件(*.h)
21、中,不需要对外公开的常量放在定义 文件化cpp)的头部4.3.4.2. 不能在类中初始化const常量,只能通过枚举常量来解决 例:错误:class aconst int size=100;(错误) int array size;正确:class a.enum stze1 = 100, size2 = 200 ; / 枚举常量 int array1stze1;int array2size2;;4.3.函数a) 参数规则(1) 参数书写要完整,不能只写类型,不写参数名,如果函数没有参数,用void填充 例如:/良好的风格/不良的风格/良好的风格/不良的风格void setvalue(int wi
22、dth, int height); void setvalue(int, int);float getvalue(void);float getvaluc ();(1) 如果参数是指针,且仅作输入用,则应在类型前加const,以免指针在函数体内 被意外修改;一般地,应将目的参数放在前面,源参数放在后面例:void strngcopy(char *strldestintion, const har *strsource)(2) 如果参数以值传递的方式传递对象,贝!|宜改用“const &”方法传递,能提高效率(1) 避免函数有太多的参数,参数个数应尽量控制在5个以内(2) 尽量不要使用类
23、型和数目不确定的参数例:int printf(const cha*format, argument.);(3) 对于内置类型参数要传值(4) 需要传指针不传引用的情形1.1. 内部需要用null状态(引用没有null状态)2.2. 若参数是被new出来的,是将在函数内被释放b) 返回值规则a. 函数的输出值结果用输出参数(一般为指针)获得,状态用return返回如果返回一个对象,一般用引用传递,但有的情况下必须用值传递 例如:class string /赋值函数string & operate二(const string &other);/相加函数,如果没有friend修饰则只
24、许有一个右侧参数friend stringoperate+( const string &si, const string &s2);private:char *m_data;string的赋值函数operate =的实现如下:string & string:operate二(const string &other)if (this = &other)return *this;delete m data;m_data 二 new charstrlen(other, data)+1;strepy (m data, other, data);return *
25、this; /返回的是*this的引用,无需拷贝过程 对于赋值函数,应当用“引用传递”的方式返回string对象。如果用“值传递”的方式, 虽然功能仍然正确,但由于etum语句要把*this拷贝到保存返回值的外部存储单元之屮, 增加了不必要的开销,降低了赋值函数的效率。例如:string a, b, c; a = b; /如果用“值传递”,将产生一次*this拷贝a = b = c; /如果用“值传递”,将产生两次*this拷贝string的相加函数operate +的实现如下:string operate+ (const string &si, const string &s
26、2)string temp;delete temp, data; / temp, data 是仅含'0'的字符串temp, data = new charstrlen(si. data) + str ien(s2. data) +1;strcpy (temp, data, si. data);strcat (temp, data, s2. data);return temp;对于相加函数,应当用“值传递”的方式返回string对象。如果改用“引用传递”,那 么函数返回值是一个指向局部对象temp的“引用”。由于temp在函数结朿时被自动销毁, 将导致返回的“引用”无效。例如:c
27、 = a + b;此时a + b并不返回期望值,c什么也得不到,流下了隐患。尽量保持函数只有唯一出口若函数返回状态,尝试用枚举作类型当函数返回引用或指针时,用文字描述其有效性禁止成员函数返回成员的引用或指针c) 函数内部规则在函数体的“入口处”,对参数的有效性进行检查,应正确使用断言(assert), 断言assert是仅在debug版本起作用的宏,它用于检查“不应该”发生的情况 例:void niemcpy(void *pvto, const void *pvfrom, size t size)assert(pvto != null) && (pvfrom != null)
28、;/ 使用断言byte *pbto = (byte *) pvto; / 防止改变 pvto 的地址 byte *pbfrom = (byte *) pvfrom; / 防止改变 pvfrom 的地址 while(size - > 0 )*pbto + = *pbfrom + ;return pvto;在函数的“出口处”,应对return语句的正确性和效率进行检查return语句不可返回指向“找内存”(内部变量)的指针或引用,因为该内存在函 数体结束时被自动销毁要搞清楚返回的究竟是值、指针,还是引用如果函数返回值是一个对象,要考虑return语句的效率4.3.4.通用规则函数的功能要单一
29、,不要设计多用途函数4342 函数体规模要小,尽量控制在100行代码以内,不包括注释和空格行4.3.43 尽量避免函数带有记忆功能,相同的输入应当产生相同的输岀(不用static变量) 示例:如下函数,其返回值(即功能)是不可预测的。unsigned int integer_sum( unsigned int base )unsignod int index;static unsigned int sum = 0; / 注意,是 static 类型的。/若改为auto类型,则函数即变为可预测。for (index = 1; index <= base; index+)sum +二 ind
30、ex;return sum;4.3.44用于出错处理的返回值一定要清楚 4.345.引用的规则引用被创建时同时被初始化不能有null引用,引用必须与合法的存储单元关联一旦引用被初始化,就不能改变引用的关系引用的功能主要是传递参数和返回值c+语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。 以下是“值传递”的示例程序。由于fund函数体内的x是外部变量n的一份拷贝,改 变x的值不会影响n,所以n的值仍然是0。void fund (int x)x = x + 10; int n 二 0;fund (n);cout « “n 二” << n <&l
31、t; endl;/ n = 0以下是“指针传递”的示例程序。由于eunc2函数体内的x是指向外部变量n的指针, 改变该指针的内容将导致n的值改变,所以n的值成为10ovoid func2(int *x)(* x) = (* x) + 10; int n 二 0;func2 (&n);cout << "n 二"<n << endl;/ n = 10以下是“引用传递”的示例程序。由于func3函数体内的x是外部变量n的引用,x和 n是同一个东西,改变x等于改变n,所以n的值成为10。void func3(int &x)x = x +
32、 10; int n = 0;func3 (n);cout << “n 二” << n << endl;/ n 二 10对比上述三个示例程序,会发现“引用传递”的性质彖“指针传递”,而书写方式象“值 传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东 西?答案是“用适当的工具做恰如其分的工作”。指针能够毫无约束地操作内存屮的如何东西,尽管指针功能强大,但是非常危险。就象 一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”, 以免发生意外。比如说,某人需要一份证明,本來在文件上盖上公章的印子就行了,如果把 取公章的钥匙交给他,那么他就获得了不该有的权利。4.2.4. 内存管理4.3.4. 内存分配方式有三种分配方式静态存储区分配,内存在编译的时候已经分配好,这块内存在整个运行期间 都存在,例如全局变量,static变量在栈上创建,执行函数时,函数内部局部变量都在栈上创建,函数执行结束
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学计算机与网络技术(网络趋势分析)试题及答案
- 2025年中职(建筑施工)建筑脚手架搭设试题及答案
- 2025年大学大一(社会学概论)社会流动试题及解析
- 2025年中职直播管理应用(应用技术)试题及答案
- 2025年大学大一(心理学)普通心理学基础试题及答案
- 2025年大学大三(金融学)国际金融试题及答案
- 2025年大学大三(建筑学)建筑历史基础试题及解析
- 2025年大学运动解剖学(内分泌系统)试题及答案
- 2025年大学大一(伦理学)伦理学基础试题及解析
- 2025年大学茶艺与茶营销(茶店经营管理)试题及答案
- DL∕T 593-2016 高压开关设备和控制设备标准的共用技术要求
- 四川大学附属中学新城分校高中教师招聘考试试题及答案
- 五斗橱的制造 五斗橱的制作
- 公司境外股权投资管理办法
- 建筑施工预算评审报告
- 国际汉语教师求职简历
- 个人营业执照注销委托书范文
- 产品外协加工作业流程
- 工程力学试题和答案解析汇总
- GB/T 4677-2002印制板测试方法
- GB/T 12464-2016普通木箱
评论
0/150
提交评论