高质量C++编程指南读书笔记

来源:互联网 发布:midaspay是什么软件 编辑:程序博客网 时间:2024/06/08 00:20

1.每个C++文件通常分为两个文件。一个文件用于保存程序的声明,称为头文件。另一个文件用于保存程序的实现,称为定义文件。

2.版权和版本的声明位于头文件和定义文件的开头,主要内容有:

(1)版权信息。

(2)文件名称,标识符,摘要。

(3)当前版本号,作者/修改者,完成日期

(4)版本历史信息。

/*

* Copyright (c) 2013,上海...

* All rights reserved.

*

* 文件名称:filename.h

* 文件标识:见配置管理计划书

* 摘    要:简要描述本文件的内容

*

* 当前版本:1.1

* 作    者:sarah-琦琦

* 完成日期:20013年11月29日

*

* 取代版本:1.0

* 原作者  :输入原作者(或修改者)名字

* 完成日期:2001年5月10日

*/


3.头文件结构

头文件由三部分组成:

(1)头文件开头处的版权和版本声明

(2)预处理块

(3)函数和类结构声明等

规则:(1)为了防止头文件被重复引用,应当用#ifndef/#define/#endif结构产生预处理块

    (2)用#include <filename.h>格式来引用标准库的头文件

     (3)用#include "filename.h"格式来引用非标准库的头文件

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

在C++语法中,类的成员函数可以在声明时被定义,并且自动成为内联函数。虽然会给书写带来方便,却造成了风格不一致,弊大于利。建议将成员 函数的定义与声明分开,不论该函数体有多么小。

(5)不提倡使用全局变量,尽量不要在头文件中出现像 extern int value这样的声明


4.定义文件的结构分为三部分:

(1)定义文件开头处的版权和版本声明;

(2)对一些头文件的引用

(3)程序的实现体


5.头文件的作用

(1)通过头文件来调用库功能。在很多场合,源代码不便向用户公布。只要向用户提供头文件和二进制的库即可。

(2)头文件能加强类型安全检查。


6.如果一个软件的头文件数目比较多,通常应将头文件和定义文件分别保存于不同的目录以便于维护。


7.版书:

(1)每个类声明之后,每个函数定义结束之后都要加空行。

(2)在一个函数体内,逻辑上密切相关的语句之间不加空行,其他地方应加空行分隔

(3)一行代码只做一件事情

(4)if ,for,while,do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}

(5)尽可能在定义变量的同时初始化该变量


8.代码行内空格:

(1)关键字之后要留有空格。有括号的先加空格再加括号

(2)函数名之后不要留空格,紧跟左括号,以区别于关键字

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

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

(5)赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格

(6)一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。

(7)“[]”、“.”、“->”这类操作符前后不加空格

(8)对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d))


9.对齐

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

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

10.长行拆分

(1)代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印

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


11.修饰符的位置

(1)应当将修饰符 * 和 & 紧靠变量名


12. 注释

(1)注释是对代码的“提示”,而不是文档。

(2)如果代码本来就是清楚的,则不必加注释。

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

(4)注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。

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

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

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


13.类的版书

建议“以行为为中心”的书写方式,即将public类型的函数写在前面,而将private类型的数据写在后面。这样做不仅让自己在设计类时思路清晰,而且方便别人阅读。因为用户最关心的是接口,谁愿意先看到一堆私有数据成员。

14.命名规则

(1)标识符应当直观且可以拼读,可望文知意,不必进行“解码”

(2)标识符的长丢应当符合最大字符长度和最小字符长度之间的原则。

(3)命名规则尽量与所采用的操作系统或开发工具的风格保持一致(例如windows的通常大小写混排,unix应用程序通常是小写 加下划线)

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

(5)程序中不要出现标识符完全相同的局部 变量和全局变量,尽管两者额作用域不同而不会发生语法错误,但是会使人误解

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

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

(8)尽量避免名字中出现数字编号

15.简单的windows应用程序命名规则

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

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

(3)常量全用大写字母,用下划线分割单词

(4)静态变量前加前缀s_

(5)如果不得已取药全局变量,则使全局变量加前缀g_

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

16.运算符的优先级

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

17.复合表达式

(1)不要编写太复杂的复合表达式

(2)不要有多用途的复合表达式

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

18.if语句

(1)不可将布尔变量直接与TRUE、FALSE或者0, 1 进行比较

(2)整型变量与零值的比较,应当将整型变量用“==”或“!=”直接与0比较

(3)浮点变量与0比较,不可将浮点变量用“==”或者“!=”与任何数字比较

(4)指针变量与零值比较,应当将指针变量用“==”或“!=”与NULL比较

(5)对if语句的补充说明:if条件里面一般把常值写在==的前面

19.循环语句的效率

(1)在多重循环中,如果有可能,应当将最长的循环放在最内层,最短循环放在最外层,以减少CPU跨切循环层的次数。

(2)如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体外 面。


20.for语句的循环控制变量

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

(2)建议for语句的循环控制变量的取值采用“半开半闭区间”的写法

21.switch语句

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

(2)不要忘记最后那个default分支。即使程序真的不需要default处理也应该保留语句default:这样做并非多此一举,而是为了防止别人误以为你忘了default处理。



22.常量

(1)如果不适用常量,直接在程序中填写数字或字符串,将会有什么麻烦?

    1)程序的可读性变差

   2)在程序的很多地方输入同样的数字或字符串,难保不发生错误

   3)如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。

(2)尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或者字符串

23.const和#define的比较

(1)const常量有数据类型,而宏常量没有数据类型。C++可以对欠着进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且字符替换可能会产生意料不到的错误

(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

24.在c++程序中只适用const常量而不适用宏常量。

25.常量定义规则

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

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

26.类中的常量

(1)不能在类声明中初始化const数据成员。

(2)const数据成员的初始化只能在类的构造函数的初始化表中进行

(3)建立类中的恒定常量,用类中的枚举常量来实现

枚举常量不会占用对象的存储空间,它们在编译时会被全部求值。枚举常量的缺点是数据类型隐含是整形,其最大值有限,且不能表示浮点数

 

27.函数设计:参数规则

(1)参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字,如果没有参数可以用void填充

(2)参数命名要恰当,顺序要合理:程序员的一般习惯是目的参数在前,源参数在后

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

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

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

(6)尽量不要使用类型和数目不确定的参数

(7)不要省略返回值的类型

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

(9)不要将正常值和错误标志混在一起返回

(10)有时候函数原本不需要返回值,但为了增加灵活性,可以附加返回值。

(11)如果返回值是一个对象,有些场合用引用传递替换值传递可以提高效率。而有些场合只能用值传递而不能用引用传递。