thinking in C++ 读书日志(一)

来源:互联网 发布:mysql5.6修改端口号 编辑:程序博客网 时间:2024/05/16 05:04

Thinking in C++

其实一直很喜欢这本书,碰上一些无聊地课程就像偷看小说一样断断续续地看,但一直没有一个空闲的时间从头到尾好好地梳理一遍。于是准备趁这个假期把整个知识体系好好总结一下。为了激励自己读下去,也为了和大家分享其中的收获,现将笔记以读书日记的形式把自己的一些感想写出来。限于篇幅,只书写其中某些精彩的细节。更多的讨论可以发邮件给我或留言。希望这篇日志也能激励大家和我一起来读这本书。让我们一起探讨,一起进步!欢迎大家和我讨论本书的细节,理解的偏差之处也欢迎大家指出。我的邮箱: suranxu007@126.com

注:其中带()的部分是为了文章的连贯性所写的,这些在书上都是有的,如果你已经看过书则可直接跳过,这样看起来将更简明扼要。以后的文章将渐渐缺省这部分内容,以突出主题。

 

2007-07-30

第一章 对象导言

    第一章主要是对“思想”的阐述,由于缺少对应的代码实现,所以看起来多多少少会有些“飘”的感觉。不过有时这也是好事,一方面文字比代码更好理解,更有利于我们对整体概念的把握;另一方面对于像我一样的初学者,掌握面向对象的思想往往比去背比如“class后面一定要加分号”要实惠与迫切得多。

本章推荐亮点:1. 面向对象语言“抽象”的思想 2.“晚捆绑的思想” 3.堆与栈 4.如何建立对象 5.极限编程思想

虽然已经学过了c++,但看到他们,依然觉得有新的收获。事实上即使现在我也无法把这本书完全读懂,每读一次都有一些新的收获吧。

 

在这里只深入探讨一下第一点,也许这些特点我们考试前都背过,但若能真正理解,则会对我们以后的编程思路有很大的启发作用。面向对象语言“抽象”的思想:

1、  万物皆对象

2、  每个对象都有一个类型

3、  程序就是一组对象,对象之间通过发送消息互相通知做什么

4、  每一个对象都有自己的一个存储区 由其它对象组成的存储区

5、  一个特定类型的所有对象都能接收相同的信息

 

其实任何一门语言说到底都是为了处理现实中的事物,而把现实中的事务转化为计算机能理解的语言,就是“抽象”的过程。对于c++,相对于具体的编码,更重要的是掌握这种面向对象的思维。其实当抛开其中的一些专业术语,我们就会发现面向对象的思考方式也正式我们人类最常用的自然思考方式。

 

1.万物皆对象

现实中所有的事物都是对象。它们既包含它们现在是什么 也包含它们将能做什么。比如我眼前这台17寸白色显示器,它可以被打开与关闭;比如桌子上这只蓝色的笔帽已经不知所踪的圆珠笔,它可以坏掉然后把笔油弄的我满桌子都是;比如我现在正在坐的椅子,它可以突然塌掉虽然我十分不希望这种事情发生;比如刚刚阳台上突然窜过的一只神似贵妇人的一只肥肥的猫,它其实可以不小心跳到楼下摔死的等等。简而言之,对象就是一个具体的事物,这些事物包含自身的静态和动态属性。

 

2.每个对象都有一个类型

就是说 只要有一个对象 则存在一个它所对应的类(class)。换而言之,任何一个具体的事物都可以由一个概念上的类型通过具体化得到。比如我眼前这台17寸的白色的可以被打开和关闭的显示器,它是一个显示器;我的这支……的圆珠笔,它是一支笔;阳台上突然窜过的眼角上翘貌似贵妇人一样高贵的但由于太胖是可以被摔死的猫,它终归还是属于猫的。也就是说我眼前的这些事物,都可以看作一些类(class)的具体化。

 

3.程序就是一组对象,对象之间通过发送消息互相通知该做什么。

我觉得这句话很经典。( 这里“发送消息”可能乍听起来有点神秘,但它其实就是对象调用自身成员函数的意思。――这本书里的所有“消息”都是指的成员函数。 )拿猫做例子:A对象是一只白白的肥胖的看起来很优雅但爪子很尖利的猫,B对象是一只黑黑的瘦瘦的很讨人喜欢但会咬人的猫。单独地看它们都只是猫类的一个对象,并不是程序。但如果把它们放在一起,黑猫咬了白猫,白猫又抓了黑猫,于是两只猫打了起来,这就是程序了。这个例子说明:1、对象不仅可以对自身进行操作 也可作用于其他对象2、程序是通过多个对象之间的相互作用来实现的。这对我们对于程序的理解,有了新的启发。

 

4.每个对象都有一个存储区 一个由其他对象组成的存储区

对象都有自动分配的存储区这自然是不需要说的。这里主要强调的是后半句话,即类是可以嵌套的,一个类可以是另一个类的成员,这种应用是十分广泛的。比如猫是一个类,某个市的猫是一个类。那么“威海市的猫”可能是假如1856只“猫”的集合(可用数组或链表存储)。这样“威海市的猫”这个档案我们可以不关注具体的猫而只写两句话:“1856只+“猫”的档案放在政府办公大楼7楼拐角面超南的屋子里”。而“猫”的档案我们则只看一只具体的猫而不用去管它是属于那个市的在市里是排行第几只出生的等等。这样信息被有效的按类别分离,它的好处是不用说的,而且当我们把两个档案组合起来一起看时所能得到的信息量又是相当可观的。

 

5.一个类型的所有对象都能接收相同的信息。

这里主要说的是继承。比如说“黑猫类”是“猫类”的一个子类。那么一个定义为对“猫类”进行的操作的信息如“将此猫阉割”,由于黑猫也是猫,所以一样的操作步骤功能上都能达到预期效果的。对这点没太多要说的,不过by the way,我认为阉割动物的行为是不值得提倡的,这种行为无论如何想象起来都太残忍,虽然邻居家那知猫从此没有弄得我连续几个晚上睡不成觉嘿嘿不过必须声明那件事可不是我干的我个人认为拿块砖头砸下去更简洁嗯,同样“将砖头狠狠放到此猫头上”也同样可以被所有“猫类”对象接收的。^_^