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

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

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

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

其實,類就是一種自定義數據類型,跟一般的類型如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都是私有類型成員。

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

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上運行這個程序,然後加些語句實現自己想要的一些其他功能。

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

思考:

  1. 類的成員訪問控制符有哪幾種?分別有什麼區別?
  2. 內聯函數的聲明有哪兩種方式?分別對應的形式是什麼?
  3. 對象和類的區別是什麼?

9/5/2016 3:04:52 PM
轉自雞啄米

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