雞啄米上講中介紹了面向對象設計的基本思想和特點,主要是讓大家在編程入門時于思維中初步建立面向對象設計的概念。這一講開始講面向對象設計中最重要的概念--類,及由類引申出來的一些知識。

       在面向過程的設計中,程序的模塊是函數構成的,而面向對象設計中程序模塊是類構成的。函數只是語句和數據的封裝,而類是函數與數據的封裝,對比下肯定是面向對象設計更重量級了,更適合大型程序的開發。

       其實,類就是一種自定義數據類型,跟一般的類型如int、char等有很多相似之處。我們可以定義int型的變量,同樣也可以定義某個類類型的變量,用類定義的變量叫做類的對象,這種定義對象的過程叫做實例化。

      1.類的聲明

      類聲明的語法形式如下:

       class 類名稱
       {
       public:
                   公有成員(外部接口)
       protected:
                   保護型成員
       private:
                   私有成員
       }

      當然,這里的public、protected和private關鍵字可以任意換順序,比如先聲明私有成員再聲明其他的也可以,每個關鍵字也可以出現多次,比如聲明一些public的成員,后面又出了個public聲明了另一些成員,也是可以的,但是一般我們還是按照上面的形式來聲明類。

      這里還是拿時鐘當例子,聲明一個類來描述時鐘:

        class  Clock                                                                      
        {
        public:                                                                              
                    void SetTime(int NewH,int NewM,int NewS);      
                    void ShowTime();                                                  
        private:                                                              
                    int  Hour,Minute,Second;                                           
        };

       類Clock封裝了時鐘的數據和行為,分別叫Clock類的數據成員和函數成員。在類的聲明中只聲明函數的原型,函數的實現也就是函數體可以在類外定義,當然也可以寫在類聲明里,那樣就成為隱式聲明的內聯函數。后面會講。下面是在類外寫函數實現的方式:

       void Clock::SetTime(int NewH, int NewM, int NewS)
       {
                   Hour=NewH;
                   Minute=NewM;
                   Second=NewS;
       }
       void Clock::ShowTime()
       {
                  cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
       }

       注意:函數名前面要加上它所屬的類,用來說明它屬于哪個類.

       這樣就完成了Clock類的聲明。首先用關鍵字class聲明類的名稱Clock,然后說明Clock類的數據成員和函數成員,通過public、private關鍵字來說明類成員的訪問控制屬性,最后給出成員函數的實現.

       2.類成員的訪問控制

       我們再通過時鐘來看看訪問控制機制。正常使用時我們只能通過時鐘面板來看時間,通過按鈕或旋鈕來調整時間,所以,面板和按鈕或旋鈕就是時鐘的外部接口,時鐘類Clock的SetTime和ShowTime就是Clock類的外部接口。除了這樣使用時鐘,我們不能拆開時鐘在內部直接改時間,那樣會弄壞時鐘的,所以時鐘的時間是私有成員,Clock類的Hour、Minute、Second都是其私有成員,外部不能直接訪問,只能通過外部接口來訪問。

       類成員訪問權限的控制是通過設置成員的訪問控制屬性來實現的。訪問控制屬性有三種:公有類型(public)、私有類型(private)和保護類型(protected)。

       公有類型聲明了類的外部接口。公有類型成員用public關鍵字聲明。外部訪問必須通過外部接口進行。比如,對于Clock類,外部想查看或改變時間只能通過SetTime和ShowTime兩個公有類型的函數實現。

       private后面聲明的是類的私有類型成員。如果沒有標明訪問控制屬性則默認為private。比如,類Clock聲明中,如果那個public沒有的話,那么SetTime和ShowTime函數就都默認是private的。私有類型成員只能由本類中的成員函數訪問,外部不能訪問。Clock類中Hour、Minute、Second都是私有類型成員。

      保護類型的成員和私有類型成員權限相似,差別就是某個類派生的子類中的函數能夠訪問它的保護成員,這個后面會講到。

雞啄米:C++編程入門系列之十三(類與對象:類的聲明、成員的訪問控制和對象)

      3.類的成員函數

       函數原型的聲明要寫在類主體中,原型說明了函數的參數類型和個數及返回值類型。而函數的具體實現是類聲明之外的,但是跟普通函數不同的是,寫函數實現時要在前面加上類名,指明所屬的類。具體的形式為:

       返回值類型  類名::函數成員名(參數表)
       {
                   函數體
       }

       類的成員函數也可以由默認參數值,它的調用規則跟之前講的普通函數相同。

       類的比較簡單的成員函數也可以聲明為內聯函數,和普通內聯函數一樣,編譯時也會將內聯函數的函數體插入到每個調用它的地方。內聯函數的聲明有兩種方式:隱式聲明和顯式聲明。

       把函數體直接放到類主體內,這種方式就是隱式聲明。比如,將時鐘類的ShowTime聲明為內聯函數,可以寫成:

        class  Clock                                                                       
        {
        public:                                                                             
                     void SetTime(int NewH,int NewM,int NewS);       
                     void ShowTime()
                     { cout<<Hour<<":"<<Minute<<":"<<Second<<endl; }                                                  
        private:                                                              
                     int  Hour,Minute,Second;                                           
        };

       為了程序的可讀性,讓大家一看就知道是內聯函數,一般還是用關鍵字inline顯式聲明。就像普通內聯函數那樣,在函數實現時在函數返回值類型前加上inline,聲明中不加入函數體,還是拿時鐘類的ShowTime舉例:

       inline void Clock::ShowTime()
       {
                   cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
       }

       效果上,顯式聲明和隱式聲明內聯函數的效果是完全一樣的。

       4.對象

       類的對象就是具有該類類型的特定實體。就像一般類型的變量一樣,類是自定義數據類型,對象就是該類類型的變量。聲明一個對象和聲明變量的方式是一樣的: 類名  對象名;。比如,聲明一個時鐘類的對象:Clock myClock;。聲明了對象后就可以訪問對象的公有成員,這種訪問需要采用“.”操作符,調用公有成員函數的一般形式是:對象名.公有成員函數名(參數表),訪問公有數據成員的形式是:對象名.公有數據成員。當然,一般數據是私有類型的,但是也不排除有時是公有類型的。例如,可以用myClock.ShowTime()的形式訪問對象myClock的成員函數ShowTime()。

       雞啄米給大家一個完整的程序舉例:

        #include<iostream>
        using namespace std;
        // 第一部分
        class Clock
        {
        public:                                                                             
                    void SetTime(int NewH,int NewM,int NewS);      
                    void ShowTime();                                                  
        private:                                                             
                    int  Hour,Minute,Second;
       };
       // 第二部分
       void Clock::SetTime(int NewH, int NewM, int NewS)
       {
                   Hour=NewH;
                   Minute=NewM;
                   Second=NewS;
       }
       void Clock::ShowTime()
       {
                  cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
       }
       // 第三部分
       int _tmain(int argc, _TCHAR* argv[])
       {   
                  Clock  myClock;
                  myClock.SetTime(8,30,30);
                  myClock.ShowTime();
                  return 0;
       }

       本程序就像注釋的那樣可以分為三個比較獨立的部分,第一個部分是類Clock的定義,第二個部分是成員函數的具體實現,第三個部分是主函數main。大家可以在vs2010上運行這個程序,然后加些語句實現自己想要的一些其他功能。

       雞啄米這節給大家講了類的聲明、類成員的訪問控制、類的成員函數及對象,內容不少,大家穩住心態慢慢理解,有問題在雞啄米博客留言討論吧。
 

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.cpbsu.com/software/49.html
2011年9月20日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:23