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) |