1. 程式人生 > >C++中的類和物件

C++中的類和物件

一、類和物件的關係

    每一個實體都是物件。有一些物件是具有相同的結構和特性的。每個物件都屬於一個特定的型別。在C++中物件的型別稱為類(class )。類代表了某一批物件的共性和特徵。前面已說明:類是物件的抽象,而物件是類的具體例項(instance)。正如同結構體型別和結構體變數的關係一樣,人們先宣告一個結構體型別,然後用它去定義結構體變數。同一個結構體型別可以定義出多個不同的結構體變數。
在C++中也是先宣告一個類型別,然後用它去定義若干個同類型的物件。物件就是類型別的一個變數。可以說類是物件的模板,是用來定義物件的一種抽象型別。類是抽象的,不佔用記憶體,而物件是具體的,佔用儲存空間。


在一開始時弄清物件和類的關係是十分重要的。

二、宣告類型別

類是使用者自己指定的型別。如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類。C++標準本身並不提供現成的類的名稱、結構和內容。
在C++中宣告一個類型別和宣告一個結構體型別是相似的。

下面是宣告一個結構體型別的方法:

struct Student //聲明瞭一個名為Student的結構體型別 

{    int num;    

      char name[20];    

      char sex; 

}; 

Student stud1,stud2; //定義了兩個結構體變數stud1和stud2,它只包括資料,沒有包括操作。 

現在宣告一個類: 

class Student //以class開頭 

{    

      int num;    

      char name[20];    

      char sex;//以上3行是資料成員    

       void display( ) //這是成員函式    

       {      

              cout<<″num:″<<num<<endl;     

              cout<<″name:″<<name<<endl;     

              cout<<″sex:″<<sex<<endl;       //以上3行是函式中的操作語句

        }   

};

Student stud1,stud2;//定義了兩個Student 類的物件stud1和stud2 

可以看到宣告類的方法是由宣告結構體型別的方法發展而來的。可以看到,類(class )就是物件的型別。實際上,類是一種廣義的資料型別。類這種資料型別中的資料既包含資料,也包含操作資料的函式。
不能把類中的全部成員與外界隔離,一般是把資料隱蔽起來,而把成員函式作為對外界的介面。

可以將上面類的宣告改為: 

class Student //宣告類型別

 {   

     private : //宣告以下部分為私有的   

           int num;    

           char name[20];   

           char sex;   

      public : //宣告以下部分為公用的   

           void display( )   

           {      

               cout<<″num:″<<num<<endl;    

               cout<<″name:″<<name<<endl;     

               cout<<″sex:″<<sex<<endl;

            } 

}; 

Student stud1,stud2;//定義了兩個Student類的物件 如果在類的定義中既不指定private,也不指定public,則系統就預設為是私有的。

歸納以上對類型別的宣告,可得到其一般形式如下:

 class 類名 

{    

      private : 私有的資料和成員函式;    

      public : 公用的資料和成員函式; 

};
private和public稱為成員訪問限定符(member access specifier)。除了private和public之外,還有一種成員訪問限定符protected(受保護的),用protected宣告的成員稱為受保護的成員,它不能被類外訪問(這點與私有成員類似),但可以被派生類的成員函式訪問。
在宣告類型別時,宣告為private的成員和宣告為public的成員的次序任意,既可以先出現private部分,也可以先出現public部分。如果在類體中既不寫關鍵字private,又不寫public,就預設為private。
在一個類體中,關鍵字private和public可以分別出現多次。每個部分的有效範圍到出現另一個訪問限定符或類體結束時(最後一個右花括號)為止。但是為了使程式清晰,應該養成這樣的習慣: 使每一種成員訪問限定符在類定義體中只出現一次。
在以前的C++程式中,常先出現private部分,後出現public部分,如上面所示。現在的C++ 程式多數先寫public部分,把private部分放在類體的後部。這樣可以使使用者將注意力集中在能被外界呼叫的成員上,使閱讀者的思路更清晰一些。
在C++程式中,經常可以看到類。為了使用者方便,常用的C++編譯系統往往向用戶提供類庫(但不屬於C++語言的組成部分),內裝常用的基本的類,供使用者使用。不少使用者也把自己或本單位經常用到的類放在一個專門的類庫中,需要用時直接呼叫,這樣就減少了程式設計的工作量。

三、定義物件的方法

8.2.2節的程式段中,最後一行用已宣告的Student類來定義物件,這種方法是很容易理解的。經過定義後,stud1和stud2就成為具有Student類特徵的物件。stud1和stud2這兩個物件都分別包括Student類中定義的資料和函式。
定義物件也可以有以下幾種方法:

  1. 先宣告類型別,然後再定義物件前面用的就是這種方法,如Student stud1,stud2;//Student是已經宣告的類型別在C++中,聲明瞭類型別後,定義物件有兩種形式。 (1)class 類名 物件名 如    class Student stud1,stud2; 把class和Student合起來作為一個類名,用來定義物件。 (2)類名 物件名 如    Student stud1,stud2; 直接用類名定義物件。 這兩種方法是等效的。第1種方法是從C語言繼承下來的,第2種方法是C++的特色,顯然第2種方法更為簡捷方便。
  2. 在宣告類型別的同時定義物件 class Student//宣告類型別{    public ://先宣告公用部分    void display( )    {       cout<<″num:″<<num<<endl;       cout<<″name:″<<name<<endl;       cout<<″sex:″<<sex<<endl;}       private ://後宣告私有部分       int num;       char name[20];       char sex;    }stud1,stud2;//定義了兩個Student類的物件 } 在定義Student類的同時,定義了兩個Student 類的物件。
  3. 不出現類名,直接定義物件 class //無類名 {    private : //宣告以下部分為私有的    ┆    public : //宣告以下部分為公用的    ┆ }stud1,stud2;//定義了兩個無類名的類物件 直接定義物件,在C++中是合法的、允許的,但卻很少用,也不提倡用。在實際的程式開發中,一般都採用上面3種方法中的第1種方法。在小型程式中或所宣告的類只用於本程式時,也可以用第2種方法。在定義一個物件時,編譯系統會為這個物件分配儲存空間,以存放物件中的成員。

四、類和結構體型別的異同

C++增加了class型別後,仍保留了結構體型別(struct ),而且把它的功能也擴充套件了。C++允許用struct來定義一個型別。如可以將前面用關鍵字class宣告的類型別改為用關鍵字struct: 

struct Student //用關鍵字struct來宣告一個類型別 

{    

   private : //宣告以下部分為私有的    

           int num;//以下3行為資料成員    

           char name[20];

           char sex;   

   public: //宣告以下部分為公用的   

           void display( ) //成員函式   

          {      

              cout<<″num:″<<num<<endl;

              cout<<″name:″<<name<<endl;

              cout<<″sex:″<<sex<<endl;   

           } 

}; 

Student stud1,stud2;//定義了兩個Student類的物件
為了使結構體型別也具有封裝的特徵,C++不是簡單地繼承C的結構體,而是使它也具有類的特點,以便於用於面向物件程式設計。用struct宣告的結構體型別實際上也就是類。用struct宣告的類,如果對其成員不作private或public的宣告,系統將其預設為public。
如果想分別指定私有成員和公用成員,則應用private或public作顯式宣告。
而用class定義的類,如果不作private或public宣告,系統將其成員預設為private,在需要時也可以自己用顯式宣告改變。如果希望成員是公用的,使用struct比較方便,如果希望部分成員是私有的,宜用class。建議儘量使用class來建立類,寫出完全體現C++風格的程式。