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

《高质量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类型,以使得其返回值为"左值"。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值