1. 程式人生 > >thinking in C++ 讀書日誌(一)

thinking in C++ 讀書日誌(一)

Thinking in C++

其實一直很喜歡這本書,碰上一些無聊地課程就像偷看小說一樣斷斷續續地看,但一直沒有一個空閒的時間從頭到尾好好地梳理一遍。於是準備趁這個假期把整個知識體系好好總結一下。為了激勵自己讀下去,也為了和大家分享其中的收穫,現將筆記以讀書日記的形式把自己的一些感想寫出來。限於篇幅,只書寫其中某些精彩的細節。更多的討論可以發郵件給我或留言。希望這篇日誌也能激勵大家和我一起來讀這本書。讓我們一起探討,一起進步!歡迎大家和我討論本書的細節,理解的偏差之處也歡迎大家指出。我的郵箱: [email protected]

注:其中帶()的部分是為了文章的連貫性所寫的,這些在書上都是有的,如果你已經看過書則可直接跳過,這樣看起來將更簡明扼要。以後的文章將漸漸預設這部分內容,以突出主題。

 

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,我認為閹割動物的行為是不值得提倡的,這種行為無論如何想象起來都太殘忍,雖然鄰居家那知貓從此沒有弄得我連續幾個晚上睡不成覺嘿嘿不過必須宣告那件事可不是我乾的我個人認為拿塊磚頭砸下去更簡潔嗯,同樣“將磚頭狠狠放到此貓頭上”也同樣可以被所有“貓類”物件接收的。^_^