高质量C/C++编程指南笔记
2011-03-20 12:05
387 查看
[b]1.文件结构[/b]
版权和版本的声明
版权和版本的声明位于头文件和定义文件的开头,主要内容有:
(1)版权信息。
(2)文件名称,标识符,摘要。
(3)当前版本号,作者/修改者,完成日期。
(4)版本历史信息。
下面是一个例子:
头文件中只存放“声明”而不存放“定义”
在 C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。因此建议将成员函数的定义与声明分开,不论该函数体有多么小。
我为什么要使用头文件?他的作用呢?
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不能)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。(ps:也就是源代码的安全性和程序的易用性吧。)
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。。
2.程序的版式
空行怎么用?
1)在每个类声明之后、每个函数定义结束之后都要加空行。
2)在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。比如if和紧接的else之间就不需要空行了。
实例如下:
代码行怎么写的“漂亮”些?
1)一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
2)if、for、while、do 等语句自占一行,执行语句不得紧跟其后。应在下一行使用“{”,再下一行写执行语句,不论执行语句有多少都要加{}。这样可以防止书写失误。
代码行内的空格风格?
看下面的表格,注意空格哦:
表达式太长?拆了他
长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
修饰符还是不随意的好
应当将修饰符 * 和& 紧靠变量名
例如:
char *name;
int *x, y; // 此处y 不会被误解为指针
int* x, y; // 此处y 会被误解为指针
命名规则
命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如 Windows 应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix 应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别混用
类名和函数名用大写字母开头的单词组合而成。如:class LeafNode;
变量和参数用小写字母开头的单词组合而成。如:int drawMode;
常量全用大写的字母,用下划线分割单词。如:const int MAX_LENGTH = 100;
静态变量加前缀s_(表示static)。如:static int s_initValue;
如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。如:int g_howManyPeople;
类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。如:
void Object::SetValue(int width, int height)
{
m_width = width;m_height = height;
}
运算符的优先级和结合率
虽然有这个表,但是记住的人不多,,所以为了自己和阅读代码的人,语句长了还是用括号吧
if语句
假设布尔变量名字为 flag,它与零值比较的标准if 语句如下:
if (flag) // 表示flag 为真
if (!flag) // 表示flag 为假
其它的用法都属于不良风格,就不要用了。
如果变量是整型假设整型变量为 value,它与零值比较的标准if 语句如下:
if (value == 0)
if (value != 0)
这时候就不要用上面那种写法了,很容易产生value是布尔类型的误解。
如果是浮点型变量就需要有误差比较,
if ((x-0>=-EPSINON) && (x-0<=EPSINON)) //其中EPSINON 是允许的误差(即精度)。其他的比如比较两个浮点数相等也可以这样来,把0改成被比较的数就行了。
如果是指针变量
if (p == NULL) // p 与NULL 显式比较,强调p 是指针变量if (p != NULL)
循环语句的效率
C++/C 循环语句中,for 语句使用频率最高,while 语句其次,do 语句很少用。
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数,下面右边的效率比左边要高。
如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。
建议for 语句的循环控制变量的取值采用“半开半闭区间”写法。像这样:for (int x=0; x<N; x++) 循环次数N次。
3.常量
在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量(就是那个#define)。
不能在类声明中初始化const 数据成员,const 数据成员的初始化只能在类构造函数的初始化表中进行
4.函数设计
好了,不更新了,感觉还是原书要好很多,把原书传上来
《高质量C.编程指南》.林锐著
版权和版本的声明
版权和版本的声明位于头文件和定义文件的开头,主要内容有:
(1)版权信息。
(2)文件名称,标识符,摘要。
(3)当前版本号,作者/修改者,完成日期。
(4)版本历史信息。
下面是一个例子:
/** Copyright (c) 2011,xx有限公司xx部 * All rights reserved. * * 文件名称:filename.h * 文件标识:见配置管理计划书 * 摘要:描述本文件的内容 * * 当前版本:1.0 * 作者: * 完成日期:3/18/2011 * * 取代版本:0.9 * 原作者: * 完成日期:2/18/2011 */
头文件中只存放“声明”而不存放“定义”
在 C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。因此建议将成员函数的定义与声明分开,不论该函数体有多么小。
我为什么要使用头文件?他的作用呢?
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不能)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。(ps:也就是源代码的安全性和程序的易用性吧。)
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。。
2.程序的版式
空行怎么用?
1)在每个类声明之后、每个函数定义结束之后都要加空行。
2)在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。比如if和紧接的else之间就不需要空行了。
实例如下:
while (condition) { statement1; // 空行 if (condition) { statement2; }//和紧接的else就不加空行了 else { statement3; } // 空行 statement4; }
代码行怎么写的“漂亮”些?
1)一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
2)if、for、while、do 等语句自占一行,执行语句不得紧跟其后。应在下一行使用“{”,再下一行写执行语句,不论执行语句有多少都要加{}。这样可以防止书写失误。
代码行内的空格风格?
看下面的表格,注意空格哦:
良好的风格 | 不良的风格 |
void Func1(int x, int y, int z); | void Func1 (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<b?a:b; |
int *x = &y; | int * x = & y; |
array[5] = 0; | array [ 5 ] = 0; |
a.Function(); | a . Function(); |
b->Function(); | b -> Function(); |
长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
修饰符还是不随意的好
应当将修饰符 * 和& 紧靠变量名
例如:
char *name;
int *x, y; // 此处y 不会被误解为指针
int* x, y; // 此处y 会被误解为指针
命名规则
命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如 Windows 应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix 应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别混用
类名和函数名用大写字母开头的单词组合而成。如:class LeafNode;
变量和参数用小写字母开头的单词组合而成。如:int drawMode;
常量全用大写的字母,用下划线分割单词。如:const int MAX_LENGTH = 100;
静态变量加前缀s_(表示static)。如:static int s_initValue;
如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。如:int g_howManyPeople;
类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。如:
void Object::SetValue(int width, int height)
{
m_width = width;m_height = height;
}
运算符的优先级和结合率
虽然有这个表,但是记住的人不多,,所以为了自己和阅读代码的人,语句长了还是用括号吧
if语句
假设布尔变量名字为 flag,它与零值比较的标准if 语句如下:
if (flag) // 表示flag 为真
if (!flag) // 表示flag 为假
其它的用法都属于不良风格,就不要用了。
如果变量是整型假设整型变量为 value,它与零值比较的标准if 语句如下:
if (value == 0)
if (value != 0)
这时候就不要用上面那种写法了,很容易产生value是布尔类型的误解。
如果是浮点型变量就需要有误差比较,
if ((x-0>=-EPSINON) && (x-0<=EPSINON)) //其中EPSINON 是允许的误差(即精度)。其他的比如比较两个浮点数相等也可以这样来,把0改成被比较的数就行了。
如果是指针变量
if (p == NULL) // p 与NULL 显式比较,强调p 是指针变量if (p != NULL)
循环语句的效率
C++/C 循环语句中,for 语句使用频率最高,while 语句其次,do 语句很少用。
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数,下面右边的效率比左边要高。
for (row=0; row<100; row++) { for ( col=0; col<5; col++ ) { sum = sum + a[row][col]; } } | for (col=0; col<5; col++ ) { for (row=0; row<100; row++) { sum = sum + a[row][col]; } } |
建议for 语句的循环控制变量的取值采用“半开半闭区间”写法。像这样:for (int x=0; x<N; x++) 循环次数N次。
3.常量
在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量(就是那个#define)。
不能在类声明中初始化const 数据成员,const 数据成员的初始化只能在类构造函数的初始化表中进行
4.函数设计
好了,不更新了,感觉还是原书要好很多,把原书传上来
《高质量C.编程指南》.林锐著
相关文章推荐
- 编程中国之高质量C++或C编程指南学习笔记
- C++高质量编程指南笔记(二)
- C++高质量编程指南笔记(三)
- 高质量C/C++编程指南 阅读笔记(二)内存管理
- C++高质量编程指南笔记(四)
- 高质量C++/C编程指南学习笔记(上)
- C++高质量编程指南笔记(一)
- 高质量C++/C编程指南学习笔记(上)
- 高质量C++/C编程指南学习笔记(上)
- 高质量C/C++编程指南笔记
- 高质量C/C++编程指南笔记
- C++高质量编程指南笔记(七)
- 高质量C++/C编程指南_读书笔记1
- C++高质量编程指南笔记(六)
- C内存管理相关内容--取自高质量C++&C编程指南
- 高质量C/C++编译指南 学习笔记
- 高质量C++/C编程指南 -- 第7章 内存管理
- 高质量C++/C编程指南 -- 第6章 函数设计
- 高质量C++/C编程指南 -- 前言
- 高质量C++/C编程指南[5]