class或關鍵字struct來定義,語法如下:class class_name {
access_specifier_1:
member1;
access_specifier_2:
member2;
...
} object_names;
|
class_name是類的有效識別符號,object_names是此類的物件的名稱的可選列表。宣告的體可以包含成員,這些成員可以是資料宣告或函式宣告,還可以包含可選的訪問說明符。private、public或protected。這些說明符會修改它們後面的成員的訪問許可權。private成員只能從同一類的其他成員(或其“朋友”)內部訪問。protected成員可以從同一類的其他成員(或其“朋友”)訪問,也可以從其派生類的成員訪問。public成員可以在任何可見物件的地方訪問。class關鍵字宣告的類的所有成員都具有私有訪問許可權。因此,在任何其他訪問說明符之前宣告的任何成員都自動具有私有訪問許可權。例如: |
|
Rectangle的類(即型別),以及該類的一個名為rect的物件(即變數)。該類包含四個成員:兩個int型別的資料成員(成員width和成員height),具有私有訪問許可權(因為私有是預設的訪問級別),以及兩個具有公共訪問許可權的成員函式:函式set_values和area。目前我們只包含了它們的宣告,而沒有包含它們的定義。Rectangle是類名(即型別),而rect是Rectangle型別的物件。這與以下宣告中的int和a的關係相同: |
|
int是型別名(類),a是變數名(物件)。Rectangle和rect之後,物件rect的任何公共成員都可以像訪問普通函式或普通變數一樣進行訪問,只需在物件名和成員名之間插入一個點(.)即可。這與訪問普通資料結構的成員的語法相同。例如: |
|
rect中唯一不能從類外部訪問的成員是width和height,因為它們具有私有訪問許可權,只能在該類的其他成員內部引用。Rectangle類的完整示例: |
|
area: 12 |
::,兩個冒號),該運算子在前面章節中與名稱空間相關。此處用於在類外部定義類的成員函式set_values。area的定義已直接包含在類Rectangle的定義中,因為其極其簡單。相反,set_values僅在類中用其原型宣告,但其定義在類外部。在此外部定義中,使用作用域運算子(::)來指定正在定義的函式是Rectangle類的成員,而不是常規的非成員函式。::)指定了正在定義的成員所屬的類,提供了與將此函式定義直接包含在類定義中完全相同的範圍屬性。例如,上例中的函式set_values可以訪問變數width和height,它們是Rectangle類的私有成員,因此只能從該類的其他成員(例如這個函式)訪問。width和height具有私有訪問許可權(請記住,如果沒有指定其他內容,使用class關鍵字定義的類的所有成員都具有私有訪問許可權)。透過將它們宣告為私有,不允許從類外部訪問。這是有意義的,因為我們已經定義了一個成員函式來為物件中的這些成員設定值:成員函式set_values。因此,程式的其餘部分不需要直接訪問它們。也許在這個如此簡單的例子中,很難看出限制對這些變數的訪問有何用處,但在更大的專案中,防止值以意外的方式(從物件的角度來看是意外的)修改可能非常重要。Rectangle類的先前示例為例,我們可以除了物件rect之外,還可以宣告物件rectb: |
|
rect area: 12 rectb area: 30 |
Rectangle,它有兩個例項(即物件):rect和rectb。它們中的每一個都有自己的成員變數和成員函式。rect.area()的結果與呼叫rectb.area()的結果不同。這是因為Rectangle類的每個物件都有自己的變數width和height,因為它們(以某種方式)也有自己的函式成員set_value和area,這些函式作用於物件自己的成員變數。rect.area或rectb.area時沒有傳遞任何引數。這些成員函式直接使用了它們各自物件rect和rectb的資料成員。set_values之前呼叫成員函式area會發生什麼?結果不確定,因為成員width和height從未被賦值。void。Rectangle類可以透過實現建構函式來輕鬆改進: |
|
rect area: 12 rectb area: 30 |
Rectangle類沒有成員函式set_values,而是有一個建構函式執行類似的操作:它使用傳遞給它的引數來初始化width和height的值。 |
|
void:建構函式從不返回值,它們只是初始化物件。 |
|
rect area: 12 rectb area: 25 |
Rectangle類的物件:rect和rectb。rect使用兩個引數構造,如之前的示例所示。rectb呼叫了預設建構函式。請注意,rectb甚至沒有用一對空括號構造——實際上,空括號不能用於呼叫預設建構函式。 |
|
rectc宣告為函式,而不是物件宣告:它將是一個不接受任何引數並返回Rectangle型別值的函式。class_name object_name = initialization_value; {})而不是圓括號(()):class_name object_name { value, value, value, ... } |
|
foo's circumference: 62.8319 |
|
|
initializer_list作為其型別的偏好。:)和類成員的初始化列表來完成的。例如,考慮一個具有以下宣告的類: |
|
|
|
|
|
|
|
|
|
foo's volume: 6283.19 |
Cylinder類有一個成員物件,其型別是另一個類(base的型別是Circle)。由於Circle類的物件只能透過引數構造,因此Cylinder的建構函式需要呼叫base的建構函式,而唯一的方法是在成員初始化列表中進行。{})而不是圓括號(()): |
|
|
|
Rectangle類物件的指標。->)從指標直接訪問物件成員。以下是一個包含一些可能組合的示例: |
|
*、&、.、->、[])。它們可以解釋為:| 表示式 | 可以讀作 |
|---|---|
*x | x指向的物件 |
&x | x的地址 |
x.y | 物件x的成員y |
x->y | 指向x的物件成員y |
(*x).y | 指向x的物件成員y(與上一行等效) |
x[0] | x指向的第一個物件 |
x[1] | x指向的第二個物件 |
x[n] | x指向的第(n+1)個物件 |
[]),而普通資料結構章節介紹了箭頭運算子(->)。class定義,還可以使用關鍵字struct和union定義。struct通常用於宣告普通資料結構,但也可以用於宣告具有成員函式的類,語法與關鍵字class相同。兩者之間的唯一區別是,使用關鍵字struct宣告的類的成員預設具有public訪問許可權,而使用關鍵字class宣告的類的成員預設具有private訪問許可權。在所有其他方面,在這方面這兩個關鍵字是等效的。struct和class定義的類不同,因為聯合一次只能儲存一個數據成員,但儘管如此,它們也是類,因此也可以包含成員函式。聯合類中的預設訪問許可權是public。其他資料型別 | 目錄 | 類 (II) |