1. 程式人生 > >C++類的宣告和物件的定義

C++類的宣告和物件的定義

每一個實體都是物件。有一些物件是具有相同的結構和特性的。每個物件都屬於一個特定的型別,這個特定的型別稱為類(class )。

類代表了某一批物件的共性和特徵。前面已說明:類是物件的模板,而物件是類的具體例項(instance)。

正如同結構體型別和結構體變數的關係一樣,需要先宣告一個結構體型別,然後用它去定義結構體變數。同一個結構體型別可以定義出多個不同的結構體變數。

在C++中也是先宣告一個類型別,然後用它去定義若干個同類型的物件。物件就是類型別的一個變數。可以說類是物件的模板,是用來定義物件的一種抽象型別。

類是抽象的,不佔用記憶體,而物件是具體的,佔用儲存空間。

類的宣告

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


在C++中宣告一個類型別和宣告一個結構體型別是相似的。下面是宣告一個結構體型別的方法:
  1. structStudent //聲明瞭一個名為Student的結構體型別
  2. {
  3. int num;
  4. char name[20];
  5. char sex;
  6. };
  7. Studentstud1, stud2; //定義了兩個結構體變數stud1和stud2,它只包括資料,沒有包括操作
現在宣告一個類:
  1. classStudent //以class開頭
  2. {
  3. int num;
  4. char name[20];
  5. char sex; //以上3行是資料成員
  6. void display( ) //這是成員函式
  7. {
  8. cout<<
    "num:"<<num<<endl;
  9. cout<<"name:"<<name<<endl;
  10. cout<<"sex:"<<sex<<endl;
  11. //以上4行是函式中的操作語句}
  12. }
  13. };
  14. Studentstud1,stud2; //定義了兩個Student 類的物件stud1和stud2
可以看到宣告類的方法是由宣告結構體型別的方法發展而來的。第1行“class Student" 是類頭(class head),由關鍵字class與類名Student組成,class是宣告類時必須使用的關鍵字,相當於宣告結構體型別時必須用struct —樣。從第2行開頭的左花括號起到倒數第2行的右花括號是類體(class body)。也就是說,類體是用一對花括號包起來的。
類的宣告以分號結束。

在類體中是類的成員列表(class member list),列出類中的全部成員。可以看到除了 資料部分以外,還包括了對這些資料操作的函式。這就體現了把資料和操作封裝在一起。 display是一個函式,對本物件中的資料進行操作,其作用是輸出本物件中學生的學號、姓 名和性別。

可以看到,類(class )就是物件的型別。實際上,類是一種廣義的資料型別。類這種資料型別中的資料既包含資料,也包含操作資料的函式。

現在封裝在類物件stud1和stud2中的成員都對外界隱蔽,外界不能呼叫它們。只有本物件中的函式display可以引用同一物件中的資料。也就是說,在類外不能直接呼叫類 中的成員。這當然“安全"了,但是在程式中怎樣才能執行物件studl的display函式呢?它無法啟動,因為缺少對外界的介面,外界不能呼叫類中的成員函式,完全與外界隔絕了。 這樣的類有什麼用處呢?顯然是毫無實際作用的。因此,不能把類中的全部成員與外界 隔離,一般是把資料隱蔽起來,而把成員函式作為對外界的介面。例如,可以從外界發出 —個命令,通知物件stud1執行其中的display函式,輸出某一學生的有關資料。

可以將上面類的宣告改為:
  1. classStudent //宣告類型別
  2. {
  3. private : //宣告以下部分為私有的
  4. int num;
  5. char name[20];
  6. char sex;
  7. public : //宣告以下部分為公用的
  8. void display( )
  9. {
  10. cout<<"num:"<<num<<endl;
  11. cout<<"name:"<<name<<endl;
  12. cout<<"sex:"<<sex<<endl;
  13. }
  14. };
  15. Studentstud1,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++語言的組成部分),內裝常用的基本的類,供使用者使用。不少使用者也把自己或本單位經常用到的類放在一個專門的類庫中,需要用時直接呼叫,這樣就減少了程式設計的工作量。

物件的定義

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

定義物件也可以有以下幾種方法。

1) 先宣告類型別,然後再定義物件
前面用的就是這種方法,如
    Student stud1, stud2;  //Student是已經宣告的類型別在C++中,聲明瞭類型別後,定義物件有兩種形式。

應該說明,在C++中,在聲明瞭類型別以後,定義物件有兩種形式。

①class 類名 物件名
如 class Student stud1,stud2;
把class和Student合起來作為一個類名,用來定義物件。

②類名 物件名
如 Student stud1,stud2;
直接用類名定義物件。

這兩種方法是等效的。第1種方法是從C語言繼承下來的,第2種方法是C++的特色,顯然第2種方法更為簡捷方便。

2) 在宣告類型別的同時定義物件
  1. classStudent//宣告類型別
  2. {
  3. public ://先宣告公用部分
  4. void display( )
  5. {
  6. cout<<"num:"<<num<<endl;
  7. cout<<"name:"<<name<<endl;
  8. cout<<"sex:"<<sex<<endl;
  9. }
  10. private ://後宣告私有部分
  11. int num;
  12. char name[20];
  13. char sex;
  14. }stud1,stud2;//定義了兩個Student類的物件
在定義Student類的同時,定義了兩個Student 類的物件。

3) 不出現類名,直接定義物件
class //無類名
{
    private : //宣告以下部分為私有的
    ┆
    public : //宣告以下部分為公用的
    ┆
}stud1, stud2;//定義了兩個無類名的類物件

直接定義物件,在C++中是合法的、允許的,但卻很少用,也不提倡用。在實際的程式開發中,一般都採用上面3種方法中的第1種方法。在小型程式中或所宣告的類只用於本程式時,也可以用第2種方法。在定義一個物件時,編譯系統會為這個物件分配儲存空間,以存放物件中的成員。

類和結構體型別的異同

C++增加了class型別後,仍保留了結構體型別(struct ),而且把它的功能也擴充套件了。C++允許用struct來定義一個型別。如可以將前面用關鍵字class宣告的類型別改為用關鍵字struct:
  1. structStudent //用關鍵字struct來宣告一個類型別
  2. {
  3. private : //宣告以下部分為私有的
  4. int num;//以下3行為資料成員
  5. char name[20];char sex;
  6. public: //宣告以下部分為公用的
  7. void display( ) //成員函式
  8. {
  9. cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;
  10. }
  11. };
  12. Studentstud1, stud2;//定義了兩個Student類的物件

為了使結構體型別也具有封裝的特徵,C++不是簡單地繼承C的結構體,而是使它也具有類的特點,以便於用於面向物件程式設計。用struct宣告的結構體型別實際上也就是類。用struct宣告的類,如果對其成員不作private或public的宣告,系統將其預設為public。

如果想分別指定私有成員和公用成員,則應用private或public作顯式宣告。

而用class定義的類,如果不作private或public宣告,系統將其成員預設為private,在需要時也可以自己用顯式宣告改變。如果希望成員是公用的,使用struct比較方便,如果希望部分成員是私有的,宜用class。建議儘量使用class來建立類,寫出完全體現C++風格的程式。