《高质量C++编程指南》读书笔记(一)

本文分享《高质量C++编程指南》的读书笔记,涵盖头文件、代码行、空格、对齐等编程规范,还涉及命名规则、表达式和基本语句、常量、函数设计等方面的建议,对C++初学者掌握编码习惯和老手改进编码方式都有帮助。

《高质量C++编程指南》是一本关于C++编程风格的指导、建议性的书,诞生已经有一年多了,初学C++,阅读此书,感觉甚好,收获很大。这本书对初学者掌握好的编码习惯有极大的帮助,对老手改进编码方式也有好处。

 

这里把读书笔记拿出来共享,希望对大家有帮助。

本书共11章,另前言以及参考文献,附录ABC建议按照原作者的意见,按照先前言,再附录,再正文的顺序阅读。

 

 

头文件:

为了防止头文件被重复引用,应当用ifndef/define/endif 结构产生预处理块。

#include <filename.h> 格式来引用标准库的头文件(编译器从标准库目录开始搜索)。

#include “filename.h” 格式来引用非标准库的头文件(编译器从用户的工作目录开始搜索)。

头文件中只存放“声明”而不存放“定义” 。

 

代码行

在每个类声明之后、每个函数定义结束之后都要加空行。

在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。

一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。

ifforwhiledo 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}

尽可能在定义变量的同时初始化该变量(就近原则)。

 

空格:

关键字之后要留空格。

函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。

‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。

‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update)

二元操作符的前后应当加空格。一元操作符前后不加空格。

象“[]”、“.”、“->”这类操作符前后不加空格。

 

对齐:

程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。

{ }之内的代码块在‘{’右边数格处左对齐。

 

长行拆分

代码行最大长度宜控制在70 80 个字符以内。

长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。

 

修饰符的位置:

应当将修饰符* 和& 紧靠变量名。

 

注释:

注释是对代码的“提示”,不是文档。不可喧宾夺主,太多了会让人眼花缭乱。花样要少。

边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。

注释应当准确、易懂,防止注释有二义性。

尽量避免在注释中使用缩写,特别是不常用缩写。

注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。

当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。

 

命名规则

标识符应当直观且可以拼读,可望文知意,不必进行“解码”。最好采用英文单词或其组合,切忌使用汉语拼音来命名。

识符的长度应当符合“min-length && max-information”原则。

命名规则尽量与所采用的操作系统或开发工具的风格保持一致。

程序中不要出现仅靠大小写区分的相似的标识符。

程序中不要出现标识符完全相同的局部变量和全局变量,会使人误解。

变量的名字应当使用“名词”或者“形容词+名词”。

全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。

类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。

用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。

尽量避免名字中出现数字编号,除非逻辑上的确需要编号。

 

简单的Windows应用程序命名规则:

类名和函数名用大写字母开头的单词组合而成。

变量和参数用小写字母开头的单词组合而成。

常量全用大写的字母,用下划线分割单词。

静态变量加前缀s_(表示static)。

如果不得已需要全局变量,则使全局变量加前缀g_(表示global

类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。

为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。

 

表达式和基本语句

如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。

不要编写太复杂的复合表达式。

不要有多用途的复合表达式。

不要把程序中的复合表达式与“真正的数学表达式”混淆。

不可将布尔变量直接与TRUEFALSE 或者10 进行比较。

应当将整型变量用“==”或“!=”直接与0 比较。

不可将浮点变量用“==”或“!=”与任何数字比较。

应当将指针变量用“==”或“!=”与NULL 比较。

不可在for 循环体内修改循环变量,防止for 循环失去控制。

每个case 语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。

不要忘记最后那个default 分支。即使程序真的不需要default 处理,也应该保留。

 

常量:

C++ 程序中只使用const 常量而不使用宏常量(#define

需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。

如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。

 

函数设计:

参数的书写要完整,如果函数没有参数,则用void 填充。

如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。

如果输入参数以值传递的方式传递对象,则宜改用“const &”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率。

避免函数有太多的参数,参数个数尽量控制在5 个以内。

不要省略返回值的类型。

函数名字与返回值类型在语义上不可冲突。

不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return 语句返回。

有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。

在函数体的“入口处”,对参数的有效性进行检查。

在函数体的“出口处”,对return 语句的正确性和效率进行检查。

1return 语句不可返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。

2)要搞清楚返回的究竟是“值”、“指针”还是“引用”

3)如果函数返回值是一个对象,要考虑return 语句的效率。

函数的功能要单一,不要设计多用途的函数。

函数体的规模要小,尽量控制在50 行代码之内。

尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。

用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值