ZWeily的小品文(二)C++入門教程(1) (轉)

worldblog發表於2007-12-14
ZWeily的小品文(二)C++入門教程(1) (轉)[@more@]

§1 從談起

畫外音:最近公司又來了一個新人,被分配到我們這個小組。結果一瞭解,原來她只學過C,沒接觸過C++,於是,我們的頭——Solmyr——就把培訓她的任務交給了我。這樣,我們這個小組就又多了一個MM,別的小組都快羨慕死了 ^_^  喔,差點忘了介紹了,新來的叫Young ……

每天的工作還是同往常一樣,似乎沒什麼變化,偶爾看看我那個新徒弟Young,她似乎總是很認真的在看書,似乎還沒和大家融合在一起,畢竟,才來了一天啊。

恩,快收工了,我還是按照慣例,開啟,收一下。

突然, 跳出一條資訊“Weily,今天收工後有空嗎?有空的話就一起吃飯吧,我請 ^_^”。

呵呵,我正愁晚飯呢。於是,我馬上回復:“好啊 :)”

……

收工完,就和Young一起去吃飯了。路上,Young就一直在問我學C++學了多久了之類的問題,我也感覺到似乎這頓飯是有目的的……

“師傅啊,你什麼時候給我指導一下C++啊?”Young終於說出了請客的目的。

“我?這個 …… 對了,Solmyr叫你去看的《The C++ Programming Language》看了多少了?”我故意扯開話題。

“啊?書我當然在看啊,不過你是Solmyr老大派給我的師傅哦,你可別想推掉培訓我的任務哦,否則,這頓飯……”

看不出來,原來她這麼精明。還搬出Solmyr的名字來威脅我,這招夠狠。

“那麼你的想法是?”

“當然是你給我上上課咯”Young使出了她最有魅力的微笑,可我總覺得這個笑容有點邪。

“那還是先回答我剛才問你的問題,那本‘聖經’看的怎麼樣了?”

“我就是看了那本書,覺得很多東西難以理解,甚至我去找了中文版的,也看不太懂,有好多問題,所以我才要你來給我指導一下啊。而且,我也在網上看過一些評價和討論,似乎很多人都說這本書不適合用……”

“的確,Bjarne自己也說過,這本的確不太適合初學者,不過,如果想要學好C++,那麼這本書是必須要看的。那麼這樣吧,我就把我自己的一些理解和逐步地告訴你,這樣給你一個對於C++的總體印象,然後,你再去看這本書,就應該有點體會了。”

“好啊,書我一定會看的。那要麼我們現在就開始第一節課吧。”Young似乎有一點迫不及待了。

“你應該聽說過物件導向吧,也就是-Oriented,簡稱OO。”

“恩,這個我知道。C++就是一種物件導向的高階語言吧。不過我對於OO也就只知道這些了”Young換了一個笑容,似乎很謙遜的樣子。

“那麼,我們這次就從物件導向開始談吧。當然,由於時間的關係,我不可能深入的講解物件導向技術,而且,我也還沒達到Solmyr那種境界,所以,我給你講的這些東西只能算是介紹,也就是入門性質的。”

“好的,具體的我會去看書的,我想書上會有更為詳盡的內容的。”

“恩,這個學習態度很好,先表揚一下。喔,在開始之前,我先問你一個問題,你對於‘Object’,也就是‘物件’這個概念有多少了解?”

“物件啊,我覺得就是一樣樣東西,可以是具體的,也可以是抽象的。”

“大致上可以這麼說。其實C++裡面的class,也就是類就相當於C中的型別,就像int、char等等,其代表的一種概念(Concept),而物件就是一個個instance(例項)。舉個簡單的例子,‘書’就是一個class,而一本《The C++ Programming Language》就是書這個class的一個instance。”

“哦,有點懂了。你繼續講吧”

本來想利用她思考的時間吃點菜的,可是我剛用筷子夾起一個菜,還沒送到嘴裡,她就理解了,可憐我只能將菜放到碗裡,等下一個時機。

“C++裡有class這個概念的目的,就是為了提供給員一種建立他們自己的型別的工具,而且,還要使得這些自定義型別和C++的內建型別一樣使用方便。所以,一個class,就是一種使用者自定義型別。而且,class能夠很好的實現資料封裝和資訊隱藏,使得使用這個class的使用者不用去了解這個class的設計細節,只要瞭解它的公共介面的功能和使用方法就可以了。我記得Solmyr和我說過,你學過C吧,那麼應該用過C裡面的struct吧?”

“恩,這個用過。在學資料結構的時候還用這個寫單連結串列之類的資料結構呢。”

“C++中的class,從某種意義上說,就是C裡面的struct,其區別麼,主要就是class中的成員(members)預設為私有的(private),而struct中的members是public的,這是最主要的區別。當然,這個區別可以透過改變訪問限制來統一的。這些具體的,你都可以從書上看到。下面我們就從例子入手。還記得資料結構中的棧(stack)這個概念嗎?”

“記得啊,就是先入後出(FILO)啊。”Young似乎很得意的樣子。

“恩。那如果我想建立一個存放整數(int)型別的棧,需要一些什麼東西呢?”

“需要一個用於存放變數的陣列。”

“陣列?如果用陣列來建立棧的話,就有一個大小限制。關於這個問題我們先不考慮。那麼我再問你,一般對於棧而言,有些什麼常用的操作?”

“入棧和出棧,也就是push和pop”Young又一次露出了得意的笑容。

“恩,看來你的資料結構學得還不錯嘛……”,我故意拖長最後一個音,似乎帶點諷刺,在等她感覺到這點前,我又馬上接著問:“這些東西,也就是那個陣列和push、pop兩個操作是密切相關的吧?”

“應該是的吧。”

“不是應該,是肯定!記住,作為一個程式設計師要對自己已經明確和掌握的東西有一定的自信!”

“知道了……”

“那麼如果在C中,能夠很好的體現出這些東西的關係嗎?”

“似乎不能。我記得以前寫的時候就是寫了push和pop兩個,另外就是建了一個陣列,可是看不出直接關係的。”

“對!但如果用C++的class來考慮這個棧,就完全不同了。你所說的那個陣列就是這個類的資料成員(data member),而push和pop兩個操作就是這個類的兩個成員函式(member function),這個類的大致定義就可以像這樣……”

我轉過身正準備找紙和筆,Young卻已經把本子和筆遞了過來,看來她的確早有預謀啊。我接過本子和筆,寫下了:

class IntStack
{
public:
  ……
  bool push(int data);
  int pop();
  ……
private:
  ……
  int _stack[MAX];
};

“這就是我剛才所說的那個整數堆疊類的大致結構了。當然,我們這裡忽略了很多細節,就好比建構函式、解構函式、複製建構函式等等,而且一個堆疊用一個陣列來實現也不好,這些細節以後我們會一個個來關注的。C++裡其實還有很多特性,等講到泛型和模板(Template)的時候,我們就可以將這個堆疊作成一個模板類。呵呵,你要學的東西還有好多,一點點來啦。”

“喔,知道了,你還要說的就是‘後面的路還很長是吧’?”Young眨著眼睛,微笑著。

“你怎麼知道我要這麼說啊?”

“這個啊?地球人都知道啊!呵呵……”

昏倒。的確,這句話我常說,熟悉我的人都知道,可是Young才來了一天啊,在吃這頓飯之前,和我說過的話大概不超過五句吧,她怎麼會知道?

哎呀,不好,飯還沒吃啊。當我想到這點的時候,發現已經完了,桌上的幾個菜基本上都已經被“消滅”了。看來,我的晚飯問題還是沒解決。而她,似乎很有收穫的樣子。我終於理解了當年Solmyr帶Pisces的時候的痛苦了。


注:
1. 參考了Bjarne Stroustrup的《The C++ Programming Language》
2. 我的C++水平麼也不高,寫這份小品文式的教程的目的是為了幫助那些還沒有入門的初學者,也幫我自己地重新學習一下C++ ^_^


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993197/,如需轉載,請註明出處,否則將追究法律責任。

相關文章