教C語言高手學C++(02)

C語言高手學C++02

類就是封裝
大師:用集成電路搞設計,你比較熟悉吧?
小蔡:那當然了。我們接觸硬件還是比較多的。一塊集成電路,就是一個功能模塊,我們根據需要選擇各個模塊,通過連線把它們連接起來,就夠構成了整個系統。
大師:其實軟件設計,何嘗也不是集成電路的設計思想呢。
我們設計整個系統的時候,也是分解策略,把整個系統,分解成若干的功能模塊,然後分別實現,最後聯合起來調試。
小蔡:還真是這個道理。
大師:那你說,那個語法特點,最像集成電路呢?
小蔡開始謹慎起來:
“對C語言來說,當然是函數這種語法了。一個函數,就是一個功能模塊,就像集成電路一樣,可以被重複調用,就像系統中使用相同的集成電路一樣。”
“聰明!”大師微笑,
“看來你的C語言基礎確實不錯。
的確是這樣的,函數算一個功能模塊的集合。並不是每個函數,都那麼的內聚,大多數函數,在操作的時候,常常要依賴系統中其他變量的結果,或者說,要改變系統中某個變量的值。
小蔡有些疑惑:你舉一個案例。
大師說:你看前面的案例:
       int deprint(char *s){  if(noisy) printf(……) }。這段代碼,就根據noisy這個變量的值來決定運行狀態。”
小蔡突然有些明白了:對,你看,on()off()兩個函數的執行,還改變了noisy的值。
大師接口到:對阿,實際上,deprint()on()off() 這樣的函數,關係非常緊密,都和noisy這個變量息息相關。他們的耦合相關性如此之強,但是C語言,居然沒有提供一種機制,把他們聚合在一起,成爲一個模塊。
小蔡有些感慨:對啊,我們在編寫有些模塊的時候,常常把一些全局變量和函數放在同一個文件中,以形成單獨模塊。而實際上,C++提供的classs這種封裝方式,把相關的函數和變量,聚合在一起,成爲一個獨立的模塊。更加方便了。
“哈哈,孺子可教。你現在明白class的第一個特性,封裝的意義了吧?”大師笑道。
“嗯,基本明白了,我以後,在程序中,就會用到這種特性,把相關的函數和變量,封裝在同一個類中。這樣還不容易出錯。”小蔡感嘆道。
“對,所以,封裝是面向對象的第一個重要特點。”大師總結道,
“這使得我們使用別人的功能模塊的時候,也要簡單很多,告訴我們有哪些類,每個類實現了那些功能即可。”
 

另外一個視角看類
“你的理解能力很強。實際上,我們使用class這種機制,還有另外一層意思。更加接近描述真實的物理世界。”
大師徐徐到:“在C中,我們如何描述客觀世界呢?比如,一輛汽車。”
小蔡:當然是用struct,我們分別記錄汽車的長,高,寬等特性,有幾個輪子,發動機型號……等等。
大師點頭:“對,其實客觀事物,總有這樣那樣的屬性,我們可以抽象成intfloatchar等類型來描述,然後集合起來,成爲一種新的類型即可。”
“但是,這只是一種數據的描述,萬事萬物皆對象,對象除了這些數據屬性之外,還有很多行爲,這些行爲,我們把他們抽象成各種函數,在C++中,我們叫他們方法。”
“任何對象,都是由屬性和方法構成,但是,C語言基本上把他們隔離開了,C++只不過把它們自然的聚合在一起。”
class,就是一種更接近客觀事物的抽象,你說是不是?”
小蔡點頭:對,其實,這是和前面的觀點相一致的。比如我們編寫的鏈表程序,頭、尾,是他們的屬性,查找,插入……等是他們的方法。我們把它們封裝在一起,更接近我們大腦中鏈表的抽象情況。
“呵呵,你學得很快。”大師比較高興,“我們來看看具體的語法吧。
 

類類型用關鍵字class定義。簡單地說,用這個關鍵字定義的類型都稱作類。比如,我們要描述計算機屏幕上的一個點,具體的語法形式如下,大師在紙上寫了一個類:
class Point

{           

private:

   int Px, Py;

public:

   Point() {Px = Py = 0; }

   Point(int x, int y) {Px = x, Py = y; }

   int &x(int );

   int &y(int );

   int drawMe ( );

   int clearMe( );

};

你看,class關鍵字,後面加入類型名,然後用{ };把它們封裝起來的這些內容,都是class的屬性或者方法。
你第一次學習C++,最重要就是要明白這點。
其次,public:範圍所定義的這些成員,不管屬性還是方法,當然,一般是方法,是可以訪問的,private:範圍內定義的,是內部使用,不可訪問。也就是說,
Point apoint
apoint.Px=10
後面這句,是不容許的。publicprivate的區別,是你要記住的第二點。
“嗯,其實我看過一點C++語法圖書,private相當於模塊內的局部變量,只有class內可以使用,外面是不可見的。”小蔡說道。
 

“對,從封裝的角度,也是可以這麼理解的。”
大師轉向計算機,
“好了,具體類如何使用,我們到計算機上,給你一個完整的案例吧。”
說完,大師在屏幕上寫了如下的代碼:
 

#include <iostream.h>

 

class Point

{

public:

    Point( ) { _x=0; _y=0; }

    Point( int x, int y);

 

private:

    int _x,_y;

 

public:

   int x() { return _x; }

   int y() { return _y; }

 

   void Show() ;

 

};

 

Point::Point(int x,int y)   

{

    _x=x;

    _y=y;

}

void Point::Show()    //在類的外部實現類中定義的成員函數

{

    cout << x() << "," << y() << "\n";

}

 

int main()

{

   Point pt1, pt2(25,64);

   pt1.Show();

   pt2.Show();

 

   cout<<"\n";

 

   Point *ptrPoint=new Point;

   ptrPoint->Show();

 

   return 0;

}

然後執行的結果出來:

 

“小蔡,上面的代碼中,在成員函數Show()調用了其它成員函數x()和y(),並不需要使用成員選擇符,從某種程度上說,也是因爲他們在同一個模塊內,使用了this指針。這些調用的隱含意義是this->x()和this->y()。”
“然而在主函數main()中調用成員函數Show()必須使用對象名pt1pt2和成員選擇符(.);另外,ptrPoint指向的對象的成員函數的調用使用的是成員選擇符(->)。”
“這是我今天希望你記住的第三點。”
“好的,”小蔡點頭在紙上記錄。
“好了”,大師開始結束今天的講課,“this指針的詳細用法,你先回去看看書;另外,爲啥運行結果圖中:爲什麼pt1.Show()ptrPoint->Show()運行結果一樣?還有,爲什麼有的成員函數的定義和實現在一起?這三個內容,我下次講課之前,先要考你哦,你回去準備一下吧。”

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章