在此非常感谢林锐博士的《高质量C++/C编程指南》一文,帮我解决了很多疑惑。现在将文中的一些知识总结一下,以备后用。
第一章 文件的结构
C++/C程序由用于声明的头文件和用于实现的定义文件组成。
头文件由三部分组成:开头的版权和版本声明、预处理块、函数和类声明等。定义文件亦由三部分组成:开头的版权和版本声明、对一些头文件的引用、程序的实现体。头文件的作用:1、通过头文件来调用库功能;2、头文件能加强类型安全检查。
程序的目录结构中,通常将头文件和定义文件保存到不同的目录中,若有些头文件是私有的,不会被其他用户程序直接引用,则可将其与定义文件放于同一目录。
第二章 程序的版式
适当添加空行,每行代码只做一件事情,尽可能在定义变量时候初始化变量。
关键字如if、for、while等之后应当加空格,“,”、”;“之后也要适当加上空格。
分界符”{ }“应独占一行且位于同一列;长行要适当拆分,长表达式要在低优先级操作符处拆分成新行,操作符放于新行之首,适当缩进。
修饰符*和&应当靠近变量名,防止变量被误解。
适当添加注释,注意注释是对代码的提示,而不是文档,不可喧宾夺主,花样太多;边改代码边改注释,没用的注释要删除,避免在注释中使用缩写;注释位置在代码的上方或者右方,若代码较长,特别是有多重嵌套时,应当在一些段落的结束处加注释以便阅读。
对于类的版式,将private类型的数据写在前面的设计是“以数据为中心”,重点关注类的内部结构;将public类型的函数写在前面的设计是”以行为为中心“,重点关注类能提供什么样的接口。文章建议采用”以行为为中心“的方式,方便自己设计类时思路清晰,因为别人关注的是类能提供的接口,而不是它的数据成员。
第三章 命名规则
共性规则是:标识符应当直观且可拼读,即望文知意;长度符合“min-Length&&max-information”原则;尽量与采用的操作系统或开发工具保持一致;不要出现仅靠大小写区分的相似标识符;不要出现名字相同的局部变量和全局变量,尽管二者作用域不同,但容易使人误解;变量名字使用“名词”或者”形容词+名词“,全局函数名字使用”动词“或”动词+名词“,类的成员函数应只使用“动词”。
“匈牙利”命名规则:在变量和函数名中加入前缀以增进人们对程序的理解,如字符变量以ch为前缀,指针变量加p前缀。
建议的附加规则:类名和函数名用大写字母开头,变量和参数用小写字母开头,常量全部大写并用下划线分割单词,类的数据成员加前缀m_,增加反映软件性质的前缀。
第四章 表达式和基本语句
运算符优先级,一元运算符+-*的优先级高于对应的二元运算符。
若表达式中的运算符较多,用括号来确定操作顺序;适当使用复合表达式。
if语句的使用:
布尔变量与零值比较时,宜用if(flag)和if(!flag),不可直接与TRUE、FALSE、1、0进行比较。
整型变量与零值比较时,宜直接用"=="和"!="和0比较。
浮点变量与零值比较时,不可直接用"=="和"!="与任何数字比较,应该设法转化成“>=”或“<=”的形式,并控制精度。
指针变量与零值比较时,应当直接用"=="和"!="与NULL比较,最好使用if(NULL==p)的方式,以免错误赋值。
循环语句的使用:
在多重循环中,若有可能,应当将最长的循环放在最内层,最短的循环放在最外层,减少CPU跨切循环层的次数;若循环体内存在逻辑判断,且循环次数不是很大,宜将逻辑判断移到循环体的外面进行分别循环。
不要在for循环体内修改循环变量,防止循环失去控制,循环控制变量宜采用“半开半闭区间”的写法。
switch语句中,在每个case语句后面都不要忘记加break;亦不要忘记default分支。
goto语句要少用、慎用,担不是禁用。