// //
//标题:Essential C++ (中文版) 读书笔记 //
// //
//作者:bill_wfm@yahoo.com.cn //
// //
//日期:2002年01月10日 //
// //
//说明:本文档为个人读书后的笔记,在此刊出希望能够与大家进行交流。 //
// //
//****************************************************************************//
第二章 面向过程的编程风格 (读书笔记)
实现独立函数的好处:
1.实现代码的重用;
2.利于团队协力开发;
函数的组成:
1.返回类型
2.函数名称:要求能够“望名知意”
3.参数列表(parameter list):扮演占物符的角色
4.函数主体
定义与声明:
1.声明 “属于” 定义;
2.声明是“给人看的”,定义是“给机器看的”;
3.函数使用之前必须先进行声明或定义;
“信任”并非良好的工程原则:
定义函数的时候,将函数的返回值定义为bool值,用于判断是否发生异常情况;而
将所希望的到的结果用reference返回。
函数的隐性退出点:
1.在main()函数中无论其返回类型如何,均可使用隐性退出点。
2.子函数中若返回值为void则只能使用隐性退出点返回或return关键值提前结束;
否则均不可!
3.一句话,“有返回值就必须返回”。
有时候我们需要的不是顽强的气质,而是有人为我们指点迷津:
多和其他人交流
参数的传值方式(pass by value):
对象仅被复制一份,原对象和复制品没有任何关联。
参数的传址方式(pass by reference):
1.reference扮演着外界与对象之间的一个间接号码牌的角色。
2.通俗的说:对象我名叫王五,外号小王。其中小王就是一个reference,王五和
小王都是代表对象我!
3.当我们以by reference方式传递对象当做函数参数,对象本身不会复制出另一份
--复制的是对象的地址。函数中对该对象进行的任何操作,都相当于对传入对
象进行间接操作。
4.参数声明为reference的原因:
A.希望得以直接对所传入的对象进行修改;
B.降低复制大型对象的负担;
5.内建型别建议不使用传址方式,主要用于传递class object之用。
const的使用:
1.可以让阅读程序的人了解不会改变所定义的对象。(主要)
2.强制程序中不能更改所定义的对象,一经改变,给出编译出错信息。(次要)
参数的指针方式传递(pass by pointer):
1.pass by pointer和pass by reference效果相同,仅仅是用法不同;
2.区别在于:
pointer可能(也可能不)指向某个实际对象,使用前必须进行合理性检
查;但是reference必定会代表某个对象,不必作此检查。
3.指针在所操纵的对象身上附件了一个间接层,提供一种“间接性”和“联结性”;
对根本不存在的对象进行寻址操作,是很不好的习惯。
生存空间(scope)和生存范围(extent)及动态范围(dynamic extent)
1.生存空间(scope)是针对于对象在程序中的可见范围而言;生存范围(extent)
则是针对于对象在程序中的生存范围而言。(两者基本一致)
2.内建型别的对象,如定义在file scope内必定被初始化为0,而local scope之内
的必须由程序员主动初始话。(建议均进行初始化)
3.动态范围(dynamic extent)则由new和delete进行管理,可以是任何型别。好
处是可以摆脱系统进行的内存管理,坏处是必须自己管理。(是一把双刃剑)
4.动态数组的删除:delete [] pia;-----而且无需进行pia==0的检查。
一般程序撰写法则是:
以“参数传递”作为函数间的沟通方式,比“直接将对象定义于file scope更适当。
默认参数值:
1.用途:简化了函数的接口参数设置。(针对于函数的用户)
2.两个规则:
A.默认值的决议(resolve)操作由最右边开始进行。
B.默认值只能够指定一次,声明或定义处均可,建议在声明处。
局部静态对象:
一种定义在file scope和local scope之间的对象,主要为了弥补local scope对象
的缺点,但是却又有local scope对象的功能。
inline函数:
一种为了提供函数的重用性,又不愿意因为函数的反复调用而损失效率的一种产物。
函数的重载:
1.一种为了不用区别:洗衣服的“洗”和洗碗的“洗”而提供一种通用的“洗”的
方法(其中洗的名称相同),动作的不同性来源于“洗”这个动作的细节。
2.参数表(parameter list)不相同(可能是参数型别不同,也可能是参数数目不
同)的两个或多个函数,可以拥有相同的函数名称。注意:不能使用洗完后的脏
水来区别,也就是返回值。
模板函数:
1.一种为了不用区别:洗衣服的“洗”和洗碗的“洗”而提供一种通用的“洗”的
方法(其中洗的动作相同),动作的不同性来源于给的是衣服还是碗。
2.使用晚捆绑机制。
函数的重载和模板函数:
一般而言,如果函数具备多种实现方式,我们可以将它重载(overload),其每份
实体提供的是相同的通用服务。如果我们希望让程序代码的主体不变,仅仅改变其
中用到的数据型别,可以通过function template达成目的。
函数指针:
1.为了将洗衣服这个动作进行包装,但是其中又区分手洗和洗衣机洗,怎么办?将
动作也作为参数进行传递即可,这就是函数指针。
2.函数的名称就是函数的地址。
3.在将函数指针作为参数时必须使用正确的语法。
头文件:
1.为了能够实现代码的公用,但又不进行重复的拷贝,可以将重用代码的声明归于
一个文件(.h)中,而在需要时使用include关键字将此文件含入其中,即可实现
所需代码的调用。
2.inline函数需要定义在头文件中,因为在每个调用点上都需要有其定义。
3.const object的用法和inline类似
8 个解决方案
#1
真认真,佩服
#2
这些笔记你以后会拿出来看吗?
我以前记的笔记都不知上哪去了,浪费纸啊
我以前记的笔记都不知上哪去了,浪费纸啊
#3
电子笔记而已~~~
#4
g z g z
#5
不错不错,希望大家以后能过多多交流自己学习的心得。
#6
我欣赏作者的务实态度!
多多交流!
多多交流!
#7
谢谢~~~希望大家多多指正~~~
#8
大家给点意见好不?!
#1
真认真,佩服
#2
这些笔记你以后会拿出来看吗?
我以前记的笔记都不知上哪去了,浪费纸啊
我以前记的笔记都不知上哪去了,浪费纸啊
#3
电子笔记而已~~~
#4
g z g z
#5
不错不错,希望大家以后能过多多交流自己学习的心得。
#6
我欣赏作者的务实态度!
多多交流!
多多交流!
#7
谢谢~~~希望大家多多指正~~~
#8
大家给点意见好不?!