C++類的宣告和物件的定義
阿新 • • 發佈:2019-02-18
每一個實體都是物件。有一些物件是具有相同的結構和特性的。每個物件都屬於一個特定的型別,這個特定的型別稱為類(class )。
類代表了某一批物件的共性和特徵。前面已說明:類是物件的模板,而物件是類的具體例項(instance)。
正如同結構體型別和結構體變數的關係一樣,需要先宣告一個結構體型別,然後用它去定義結構體變數。同一個結構體型別可以定義出多個不同的結構體變數。
在C++中也是先宣告一個類型別,然後用它去定義若干個同類型的物件。物件就是類型別的一個變數。可以說類是物件的模板,是用來定義物件的一種抽象型別。
類是抽象的,不佔用記憶體,而物件是具體的,佔用儲存空間。
在C++中宣告一個類型別和宣告一個結構體型別是相似的。下面是宣告一個結構體型別的方法: 類的宣告以分號結束。
在類體中是類的成員列表(class member list),列出類中的全部成員。可以看到除了 資料部分以外,還包括了對這些資料操作的函式。這就體現了把資料和操作封裝在一起。 display是一個函式,對本物件中的資料進行操作,其作用是輸出本物件中學生的學號、姓 名和性別。
可以看到,類(class )就是物件的型別。實際上,類是一種廣義的資料型別。類這種資料型別中的資料既包含資料,也包含操作資料的函式。
現在封裝在類物件stud1和stud2中的成員都對外界隱蔽,外界不能呼叫它們。只有本物件中的函式display可以引用同一物件中的資料。也就是說,在類外不能直接呼叫類 中的成員。這當然“安全"了,但是在程式中怎樣才能執行物件studl的display函式呢?它無法啟動,因為缺少對外界的介面,外界不能呼叫類中的成員函式,完全與外界隔絕了。 這樣的類有什麼用處呢?顯然是毫無實際作用的。因此,不能把類中的全部成員與外界 隔離,一般是把資料隱蔽起來,而把成員函式作為對外界的介面。例如,可以從外界發出 —個命令,通知物件stud1執行其中的display函式,輸出某一學生的有關資料。
可以將上面類的宣告改為:
歸納以上對類型別的宣告,可得到其一般形式如下:
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++語言的組成部分),內裝常用的基本的類,供使用者使用。不少使用者也把自己或本單位經常用到的類放在一個專門的類庫中,需要用時直接呼叫,這樣就減少了程式設計的工作量。
定義物件也可以有以下幾種方法。
1) 先宣告類型別,然後再定義物件
前面用的就是這種方法,如
Student stud1, stud2; //Student是已經宣告的類型別在C++中,聲明瞭類型別後,定義物件有兩種形式。
應該說明,在C++中,在聲明瞭類型別以後,定義物件有兩種形式。
①class 類名 物件名
如 class Student stud1,stud2;
把class和Student合起來作為一個類名,用來定義物件。
②類名 物件名
如 Student stud1,stud2;
直接用類名定義物件。
這兩種方法是等效的。第1種方法是從C語言繼承下來的,第2種方法是C++的特色,顯然第2種方法更為簡捷方便。
2) 在宣告類型別的同時定義物件
3) 不出現類名,直接定義物件
class //無類名
{
private : //宣告以下部分為私有的
┆
public : //宣告以下部分為公用的
┆
}stud1, stud2;//定義了兩個無類名的類物件
直接定義物件,在C++中是合法的、允許的,但卻很少用,也不提倡用。在實際的程式開發中,一般都採用上面3種方法中的第1種方法。在小型程式中或所宣告的類只用於本程式時,也可以用第2種方法。在定義一個物件時,編譯系統會為這個物件分配儲存空間,以存放物件中的成員。
為了使結構體型別也具有封裝的特徵,C++不是簡單地繼承C的結構體,而是使它也具有類的特點,以便於用於面向物件程式設計。用struct宣告的結構體型別實際上也就是類。用struct宣告的類,如果對其成員不作private或public的宣告,系統將其預設為public。
如果想分別指定私有成員和公用成員,則應用private或public作顯式宣告。
而用class定義的類,如果不作private或public宣告,系統將其成員預設為private,在需要時也可以自己用顯式宣告改變。如果希望成員是公用的,使用struct比較方便,如果希望部分成員是私有的,宜用class。建議儘量使用class來建立類,寫出完全體現C++風格的程式。
類代表了某一批物件的共性和特徵。前面已說明:類是物件的模板,而物件是類的具體例項(instance)。
正如同結構體型別和結構體變數的關係一樣,需要先宣告一個結構體型別,然後用它去定義結構體變數。同一個結構體型別可以定義出多個不同的結構體變數。
在C++中也是先宣告一個類型別,然後用它去定義若干個同類型的物件。物件就是類型別的一個變數。可以說類是物件的模板,是用來定義物件的一種抽象型別。
類是抽象的,不佔用記憶體,而物件是具體的,佔用儲存空間。
類的宣告
類是使用者自己指定的型別。如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類。C++標準本身並不提供現成的類的名稱、結構和內容。在C++中宣告一個類型別和宣告一個結構體型別是相似的。下面是宣告一個結構體型別的方法:
- structStudent //聲明瞭一個名為Student的結構體型別
- {
- int num;
- char name[20];
- char sex;
- };
- Studentstud1, stud2; //定義了兩個結構體變數stud1和stud2,它只包括資料,沒有包括操作
- classStudent //以class開頭
- {
- int num;
- char name[20];
- char sex; //以上3行是資料成員
- void display( ) //這是成員函式
- {
- cout<<
- cout<<"name:"<<name<<endl;
- cout<<"sex:"<<sex<<endl;
- //以上4行是函式中的操作語句}
- }
- };
- Studentstud1,stud2; //定義了兩個Student 類的物件stud1和stud2
在類體中是類的成員列表(class member list),列出類中的全部成員。可以看到除了 資料部分以外,還包括了對這些資料操作的函式。這就體現了把資料和操作封裝在一起。 display是一個函式,對本物件中的資料進行操作,其作用是輸出本物件中學生的學號、姓 名和性別。
可以看到,類(class )就是物件的型別。實際上,類是一種廣義的資料型別。類這種資料型別中的資料既包含資料,也包含操作資料的函式。
現在封裝在類物件stud1和stud2中的成員都對外界隱蔽,外界不能呼叫它們。只有本物件中的函式display可以引用同一物件中的資料。也就是說,在類外不能直接呼叫類 中的成員。這當然“安全"了,但是在程式中怎樣才能執行物件studl的display函式呢?它無法啟動,因為缺少對外界的介面,外界不能呼叫類中的成員函式,完全與外界隔絕了。 這樣的類有什麼用處呢?顯然是毫無實際作用的。因此,不能把類中的全部成員與外界 隔離,一般是把資料隱蔽起來,而把成員函式作為對外界的介面。例如,可以從外界發出 —個命令,通知物件stud1執行其中的display函式,輸出某一學生的有關資料。
可以將上面類的宣告改為:
- classStudent //宣告類型別
- {
- private : //宣告以下部分為私有的
- int num;
- char name[20];
- char sex;
- public : //宣告以下部分為公用的
- void display( )
- {
- cout<<"num:"<<num<<endl;
- cout<<"name:"<<name<<endl;
- cout<<"sex:"<<sex<<endl;
- }
- };
- Studentstud1,stud2; //定義了兩個Student類的物件
歸納以上對類型別的宣告,可得到其一般形式如下:
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) 在宣告類型別的同時定義物件
- classStudent//宣告類型別
- {
- 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類的物件
3) 不出現類名,直接定義物件
class //無類名
{
private : //宣告以下部分為私有的
┆
public : //宣告以下部分為公用的
┆
}stud1, stud2;//定義了兩個無類名的類物件
直接定義物件,在C++中是合法的、允許的,但卻很少用,也不提倡用。在實際的程式開發中,一般都採用上面3種方法中的第1種方法。在小型程式中或所宣告的類只用於本程式時,也可以用第2種方法。在定義一個物件時,編譯系統會為這個物件分配儲存空間,以存放物件中的成員。
類和結構體型別的異同
C++增加了class型別後,仍保留了結構體型別(struct ),而且把它的功能也擴充套件了。C++允許用struct來定義一個型別。如可以將前面用關鍵字class宣告的類型別改為用關鍵字struct:- structStudent //用關鍵字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;
- }
- };
- Studentstud1, stud2;//定義了兩個Student類的物件
為了使結構體型別也具有封裝的特徵,C++不是簡單地繼承C的結構體,而是使它也具有類的特點,以便於用於面向物件程式設計。用struct宣告的結構體型別實際上也就是類。用struct宣告的類,如果對其成員不作private或public的宣告,系統將其預設為public。
如果想分別指定私有成員和公用成員,則應用private或public作顯式宣告。
而用class定義的類,如果不作private或public宣告,系統將其成員預設為private,在需要時也可以自己用顯式宣告改變。如果希望成員是公用的,使用struct比較方便,如果希望部分成員是私有的,宜用class。建議儘量使用class來建立類,寫出完全體現C++風格的程式。