《高质量C++/C编程指南》------作者林锐博士
作者在前言中所讲的关于编程老手与编程高手以及结合自己的经历,给我们讲述了关于编程质量的重要性以及必须对于其质量的重视。
1.知错就改。
2.经常温故而知新。
3.坚持学习,天天向上。
从这里面抽取精华,对其加以整理,形成自己的笔记,在后面的学习过程中可以加以巩固。
——————————————————————————————————————————
第一章和第二章是关于文件结构和程序版式的要求,看这两章可结合上篇的《编程修养》中提到的细节。
1.头文件的作用
a.通过头文件来调用函数库的功能。有时候为了保密,只提供函数库和头文件,而使用者不必关心接口是如何实现的。
b.头文件能加强类型安全检查。如果某个接口在使用或被使用时,其实现方式与头文件中声明的不一致,编译器会指出错误,减轻程序员的调试。
2.类的版式
类提供关键字public,privat,protected.建议把public写在前面,体现“以行为为中心”
——————————————————————————————————————————
第三章
介绍了关于在C程序中标识符的命名规则,这也是提高C质量必须要注意的,公司里面关于编码应该有相关的归定。
假如bool变量的名字为flag,它与零值标准if语句如下:
if(flag) //表flag为真
if(!flag) //表flag为假
假如整形变量的名字为value,它与零值标准if语句如下:
if( 0 == value )
if( 0 != value )
浮点变量x与零值标准if 语句如下:
if(( x >= -EPSINON ) && ( x <=EPSINON )) //其中EPSINON是允许的误差
指针变量p用“==”或“!=”与NULL比较,它与零值标准if语句如下:
if( p == NULL )
if( p != NULL )
建议for语句的循环控制变量的取值采用“半开半闭区间”写法
每个case语句之后不要忘记加break语句。
不要忘记最后那个default分支。 default: break;
——————————————————————————————————————————
第五章
C中有#define来定义常量(硬常量),C++中除了用#define来定义常量,还可以用const来定义常量。
如果在程序中出现“硬编码”,首先不便于阅读,不能做到见名知义,易错,不能做到一改全改。
C++中用const完全代替#define
const数据成员的初始化中只能在类构造函数的初始化表中进行。
class A
{
A(int size);
const int SIZE;
};
A::A(int size) :SIZE(size) //构造函数初始化表
如何才能建立整个类的恒定的常量呢?
别指完const成员了,应该在类中用枚举变量来实现。
class A
{
enum {SIZE1=100,SIZE2=200}; //枚举常量
int array1[SIZE1];
int array2[SIZE2]
};
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举的常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数。
#define 、const 和inline的相比较
—————————————————————————————————————————
#define 1.是宏而不是函数
2.无类型,不占存储空间
3.具有全局属性
4.不进行语法检查,易错,会有歧义
5.预编译的时候展开,效率高,无需额外的空间和时间
6.不能访问对象的私有成员 ------>与 inline相比
7.#define PASTE(n) "abc"#n 结果为abcn
8.#define NUM(a,b,c) a##b##c 结果为abc
9.遇到#@符号,将#@之后的部分用单引号括起来
------------------------------------------------
const 1.具有变量的属性
2.有类型,占存储单元
3.进行语法检查,不易出错
-------------------------------------------------
inline 1.是内联函数,可以访问类的保护成员及私有成员,而#define则不可以。
2.具有普通函数的特性(完成类型,语句是否正确,而宏不具有)
3.进行严格的参数检查
4.编译时展开(函数代码放入符号表,在使用时直接替换,没有调用的开销,效率很高)
5.在编译的时候,内联函数可嵌入目标代码,而宏只是简单的文本替换
—————————————————————————————————————————
为什么不把所有的函数都定义为内联函数?
1.内联是以代码膨胀为代价,仅仅省去了调用的开销,从而提高函数的执行效率。
2.如果执行函数代码的时间相比于函数调用的开销大,那么效率收获就会少,而每一处的内联函数都要复制代码,将使程序的总代码增加,消耗更多的内存空间。
以下情况不用:
a.代码较长。
b.函数体内出现循环(假如使用的话,函数只展开一次)。
优点:节省了程序指针在堆栈中移动的时间
缺点:增加了文件的容量。
—————————————————————————————————————————
const关键字至少有下列5个作用
1.欲阻止一个变量被改变,可以用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了。
2.对于指针来说,可以指定指针本身为const,也可以指定指针的数据为const,或者两者同时指定const
3.在一个函数声明中,const可以修饰形参,表明它是一个输入函数,在函数体内不能改变其值。
4.对于类的成员函数,若指定其为 const类型,则表明其是一个常函数,不能修改其类的成员变量。
5.对于类的成员函数有时指定其返回值为const类型,以使得其返回值为"左值"。