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;       //以上4行是函數中的操作語句}    };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++風格的程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM