C 類的宣告和物件的定義

2021-06-27 01:35:47 字數 4110 閱讀 4787

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

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

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

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

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

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

在c++中宣告乙個類型別和宣告乙個結構體型別是相似的。下面是宣告乙個結構體型別的方法:

struct

student

//宣告了乙個名為student的結構體型別

;student

stud1, stud2;

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

現在宣告乙個類:

class

student

//以class開頭}}

;student

stud1,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函式,輸出某一學生的有關資料。

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

class

student

//宣告類型別};

student

stud1,stud2;

//定義了兩個student類的物件

如果在類的定義中既不指定private,也不指定public,則系統就預設為是私有的。

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

class 類名

;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) 在宣告類型別的同時定義物件

class

student

//宣告類型別

private

://後宣告私有部分

int num;

char name[

20];

char ***;

}stud1,stud2;

//定義了兩個student類的物件

在定義student類的同時,定義了兩個student 類的物件。

3) 不出現類名,直接定義物件

class //無類名

stud1, stud2;//定義了兩個無類名的類物件

直接定義物件,在c++中是合法的、允許的,但卻很少用,也不提倡用。

在實際的程式開發中,一般都採用上面3種方法中的第1種方法。在小型程式中或所宣告的類只用於本程式時,也可以用第2種方法。在定義乙個物件時,編譯系統會為這個物件分配儲存空間,以存放物件中的成員。

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

struct

student

//用關鍵字struct來宣告乙個類型別};

student

stud1, stud2;

//定義了兩個student類的物件

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

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

而用class定義的類,如果不作private或public宣告,系統將其成員預設為private,在需要時也可以自己用顯式宣告改變。如果希望成員是公用的,使用struct比較方便,如果希望部分成員是私有的,宜用class。

建議盡量使用class來建立類,寫出完全體現c++風格的程式。

宣告類和定義物件

class date private,public稱之為成員訪問限定符,此外還有protect。被宣告為private 私有成員 只能被本類中的成員函式引用,而public 公用成員 可以被本類的成員所引用,也可以被類外函式引用,protect宣告的為受保護的成員,不能被類外訪問,但可以被派生類的成...

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

似乎研究生階段c 用的比較多,乾脆就開始學習c 了,先把oop這塊兒搞懂,再去刷演算法啥的吧。類的宣告可以用struct或者class,c 中用class比較多。class預設成員是private,struct預設成員是public。例如宣告乙個地主類,其標頭檔案為 pragma once incl...

C 類的定義和宣告

c 語言可以看成是c語言的擴充套件和改進,相對於c語言,c 語言主要是增添了物件導向的特性。類 class 則是c 物件導向程式設計的實現方式。無論是何種程式語言,進行物件導向程式設計都將是從類的設計開始的。什麼是類呢?其實很簡單,我們可以理解為一種使用者自定義的資料型別,類似於c語言裡面的結構體 ...