今天是個不錯的日子,不僅有人收了我做徒弟從此傳授我有關C++的一些知識,由於前一段時間喜歡上了外掛的研究也用到了一些MFC的知識及一些Windows APIs編程,但是對C++還是沒有從根本上認識。我從來沒有過一個真正意義上的電腦老師(那些只會拿著課件給我念的不算),由於一路走來都只有我一個人,身邊的人也全是學習科研的,美其名曰:生物工程,我想考過大學的人都知道這個科目的熱度有多大---全國十大騙人專業之首。我放棄了我的專業的所有,一頭投向電腦中,這可能也是由於我在高中就開始玩“駭客技術”以及我對電腦的敬仰之情所致。說了這麼多,都是要感謝這位師傅,而且還是個女生,雖然我們是在網路上認識.....前一段時間看了《Windows核心編程》沒有深入瞭解,誰都知道一本比較好的書沒看個幾遍是很難懂得他的精髓的,和我學習.NET一樣(我看了紅皮人頭書WROX出版的《.NET入門經典》總共四遍,第一遍不知道說什麼;第二編好像是這樣;第三遍基本上懂一點;第四遍他才真正把我從VB中給帶到C#過來而一發不可自拔,其實中間版本也有更替了現在應該是第4版了吧<懷疑中>)。今天師傅就推薦了一本《C++程式語言設計》今晚下班回來我就慢慢的讀起,C++之父的著作應該不錯,從今後的一些文章中我會記錄一些我對C++的理解,我要把他從0開始的學期。開了他的寫作方法不愧為一代大師,看的很爽很容易把我帶入狀態。
C++中有標頭檔和實現檔案共同來完成一個類或其他的方法,更術語一點是一個是聲明,一個是定義,聲明是讓人能夠在不同的程式頁面或不同的DLL之間知道你到底有多少東西,這裡也可以這樣解釋你到底想讓人知道多少;而定義是你聲明的函數(方法)是怎樣完成一件事情的,也就是方法的實現。在《C++程式語言設計》中舉了個堆棧的例子,例如我們在Stack.h中聲明了一個類,而在Stack.cpp中實現了這個類的方法(當然要include標頭檔),當我們在其他頁面中要用到Stack類時就要引用到Stack.h檔案,如所示:
下面我們來看看Stack.h的定義:
class Stack
{
public:
Stack(int s);
~Stack(void);
private:
const int max_size;
char* v;
int top = 0;
public:
void push(char c);
char pop();
class Overflow{};//異常
class Underflow{};//異常
class BadSize{};//異常
};
下面是實現Stack.h的Stack.cpp的定義:
1 #include "Stack.h"
2
3 Stack::Stack(int s)
4 {
5 top = 0;
6 if(s < 0 || s > 10000)
7 throw BadSize();
8
9 max_size = s;
10 v = new char[s];
11 }
12
13 Stack::~Stack(void)
14 {
15 delete[] v;
16 }
17
18 Stack::push(char c)
19 {
20 if(top == max_size)
21 throw Overflow();
22
23 v[top] = c;
24 top++;
25 }
26
27 Stack::pop()
28 {
29 if(top = 0)
30 throw Underflow();
31 top--;
32 return v[top];
33 }
從上面我們就可以看出了怎樣定義一個類,這個只是堆棧的一種,可能不同類型的堆棧他們的push和pop的方法實現的不一樣,這樣我們為了能夠提供給多個類型使用物件導向的特性“繼承”。把Stack類定義為一個抽象類別型,而實現抽象類別型中的方法的不同類型也稱為多態類型。我們需要藉助關鍵字virtual來聲明,例如我們只要把上面的push和pop方法的聲明改成如下所示:
virtual void push(char c)=0;
virtual char pop()=0;
從上面我們可以看到聲明後帶著“=0”這個表示在繼承的子類中必須重寫此方法[如果你熟悉C#的話,我覺得這就是抽象abstract]。當然當我們應用到其他函數中是可以聲明一個引用變數如下所示:
void f(Stack& s);
這樣將繼承的子類執行個體引用到f的參數中就可以實現了[C#和這個很像,也許C#就是從這邊接過來的東西,我是.NET的開發人員對此也比較熟悉就不多說了]。當我們子類繼承基類時具有幾個存取權限,通常我們使用的都是public關於這個我們在以後還會碰到這裡就不多說了,要繼承一個基類,必須包含基類的標頭檔,並在聲明類的時候通過":"來實現繼承如:ListStack:public Stack,子類的實現方式和其他一樣。
看大師的書真的很爽,不知不覺被他引入了。慢慢的由淺入深一個一個概念孕育而生,今天理解了這些東東我想也應該完成任務了,OK關電腦睡覺!再次謝謝師傅的推薦!