考完研,开始读这本书,受益匪浅,更多的还是在落实到实践中去吧
跟大家分享下,欢迎大家补充
第一章 文件结构
头文件表示声明(declaration),定义文件保存实现(implementation)1.1版权和版本的声明,如下所示:
/*
* Copyright (c) 2001,上海贝尔有限公司网络应用事业部
* All rights reserved.
*
* 文件名称:filename.h
* 文件标识:见配置管理计划书
* 摘 要:简要描述本文件的内容
*
* 当前版本:1.1
* 作 者:输入作者(或修改者)名字
* 完成日期:2001年7月20日
*
* 取代版本:1.0
* 原作者 :输入原作者(或修改者)名字
* 完成日期:2012年1月9日
*/
1.2头文件结构
包含三个部分:
1、版本和版权信息(如1.1)
2、预处理块
为了防止头文件被重复使用,需要用ifndef/define/endif结构进行预处理)
用#include <file.h>引用标准库文件
用#include “file.h”引用非标准库文件
3、函数和类结构声明等
头文件中只存放声明,不存放定义
不提倡使用全局变量,尽量少用extern int value 这类声明
头文件实例:
// 版权和版本声明见示例1-1,此处省略。(文件名为graphics.h)
#ifndef GRAPHICS_H // 防止graphics.h被重复引用
#define GRAPHICS_H
#include <math.h> // 引用标准库的头文件
…
#include “myheader.h” // 引用非标准库的头文件
…
void Function1(…); // 全局函数声明
…
class Box // 类结构声明
{
…
};
#endif
1.3 定义文件的结构
三部分:
1、版本和版权信息(如1.1)
2、对头文件的引用
3、程序的实现体
1.4头文件的作用
1、调用库函数
2、加强类型安全检查
第二章 程序的版式
2.1空行的使用
2.2代码行 (一行只做一件事)
2.3代码行内的空格
2.4对齐
2.5长行拆分(在低优先级操作符处拆分,操作符放在新行开头位置,适当缩进)
2.6修饰符的位置(*与&应该靠近变量名而不是数据类型)
2.7注释
2.8类的版式
第三章 命名规则
3.1共性规则
直观可读。最好用英文和英文组合
长度适当
与操作系统和开发工作风格一致。Windows采用“大小写”,AddChild。而Unix采用“小写加下划线”add_child的方式。
不要出现仅靠大小写区分的标识符
不出现标识符完全相同的局部变量和全局变量
变量名字使用“名词”或“形容词+名词”。
全局函数的名字用“动词”或“动词+名词”,DrawBox();类的成员函数只使用“动词”,box->Draw()。
用反义词组命名具有互斥意义的变量或相反动作的函数。
避免名字中出现数字编号。
3.2Windows应用程序命名规则
类名和函数名用大写字母开头的单词组合而成
变量和参数用小写字母开头
常量全用大写,用下划线分割
静态变量加前缀"s_"
全局变量加前缀“g_”
类的数据成员加前缀"m_"
第四章 表达式和基本语句
4.1 运算符优先级问题
4.2 复合表达式
4.3 if语句
1、不可将bool型变量直接与TRUE/FALSE/1/0进行比较
if (flag) //flag为真
if (!flag) //flag为假
2、整型变量与零值进行比较用"=="或"!=";3、浮点变量不可用"=="与"!="进行比较。
4、指针变量与零值进行比较,
if(p == NULL) 或 if(p != NULL)
5、可以使用 if (NULL == p)以便于防止出错
4.4 循环语句的效率
1、尽可能将循环长的放内层,循环短的放外层
2、将逻辑判断放在循环体外面,减少判断次数
4.5for循环控制变量
最好不在内部改变循环控制变量
半开半闭区间
4.6 switch语句
不要忘了break;
不要忘了default分支。default : break;
4.7 goto语句
慎用。如多层循环的跳出等。
第五章 常量
5.2 const 与#define的比较
const常量有数据类型,宏常量没有
在C++中用const常量,在C中用宏常量
5.3 常量定义规则
需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。
如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。
5.4 类中的常量
第六章 函数设计
6.1 参数的规则
1、参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void填充。
2、参数命名要合适,顺序要合理
3、若参数为指针,且仅作输入用,则在类型前加const,以防止被意外修改
4、避免太多参数,避免类型和树木不确定的参数
6.2 返回值规则
1、类型不能省略
2、函数名字与返回值类型不可在语义上冲突
getchar()的返回值为int型。
3、不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。
4、有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。
strcpy(char *strDest, const char *strSrc)在完成复制功能的同时会返回strDest。
6.3 函数内部实现的规则
1、在函数的“入口处”对参数的有效性进行检查。
正确使用“断言”(assert)来防止由非法参数引起的错误。
2、在函数的“出口处”对return语句的正确性和效率进行检查。
1、return不可返回指向“栈内存”的“指针”或“引用”,因为该内存在函数体结束时被自动销毁。
2、要搞清楚返回的是值、指针还是引用。
3、如果返回的是一个对象,要考虑return的效率。
6.4 其它
1、函数功能要单一。
2、函数体规模要小。50 lines。
3、尽量避免函数带有“记忆”功能,尽量少用static局部变量。
4、不仅要检查输入函数参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性,如全局变量或文件句柄等。
6.5断言
1、程序分为debug版本(内部调试)和Release版本(发行)。
2、assert仅在Debug版本起作用的宏,用于检查“不应该”发生的事。
3、使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
4、函数的入口处,使用断言检查参数的有效性(合法性)。
5、】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
6、一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行 报警。
6.6 引用与指针的比较
自己写的代码实在太烂了
受教了
继续啃书