類別 (class) 是物件 (object) 的模板,物件的所有功能都由類別設置。
典型的類別設計如下
class class_name { | |
access_label_1: | |
// member | |
access_label_2: | |
// member | |
}; |
利用關鍵字 (keyword) class 宣告類別名稱,其後的大括弧為類別的宣告內容,裡頭用存取標籤 (access label) 區分成員 (member) 的權限。存取標籤有三種,分別是 public 、 private 與 protected ,這三個標籤也都屬於關鍵字。
public 成員可以由所有使用物件的地方自由呼叫, private 成員則限制在類別中呼叫,也就是類別的成員才可以使用 private 成員, protected 成員的使用範圍與 private 成員相同,但是 private 成員不能被繼承 (inheritance) , protected 成員則可以被繼承。
如果在類別宣告中沒有寫存取標籤的話,預設為 private 。
使用 private 成員可達到把資料封裝 (encapsulation) 的目的,此為物件導向程式設計 (object-oriented programming) 的主要特性之一。
成員可以是變數 (variable) 或函數 (function) ,前者稱為資料成員 (data member) ,這是專屬於物件的變數,後者則稱之為成員函數 (member function) ,這也是專屬於物件的函數,需要透過物件進行呼叫。
注意,大括弧最後的分號是必須的。舉一例如下
001 | #include <iostream> |
002 | |
003 | class Demo { |
004 | public: |
005 | int a; |
006 | int b; |
007 | |
008 | int do_something() { |
009 | return a + b; |
010 | } |
011 | }; |
012 | |
013 | int main() { |
014 | Demo d; |
015 | d.a = 11; |
016 | d.b = 22; |
017 | std::cout << d.do_something() |
018 | << std::endl; |
019 | |
020 | return 0; |
021 | } |
022 | |
023 | /* Kaiching Chang |
024 | u09.cpp |
025 | 2014-02 */ |
此例宣告了類別 Demo ,裡頭有三個成員,兩個 int 變數與一個回傳 int 的函數
003 | class Demo { |
004 | public: |
005 | int a; |
006 | int b; |
007 | |
008 | int do_something() { |
009 | return a + b; |
010 | } |
011 | }; |
然後在 main() 宣告 Demo 型態的變數 d ,此時 Demo 型態的物件 d 已建立,接著再用小數點運算子設定兩個資料成員
014 | Demo d; |
015 | d.a = 11; |
016 | d.b = 22; |
編譯執行,結果如下
$ g++ u09.cpp |
$ ./a.out |
33 |
$ |
我們是把成員函數的定義放到類別宣告中,成員函數的定義可以移出類別宣告,這樣的類別宣告就是單純的宣告
class Demo { | |
public: | |
int a; | |
int b; | |
int do_something() ; | |
}; |
這樣成員函數的實作就移出類別宣告外,在函數名稱前要加上類別名稱與作用域運算子,如下
int Demo::do_something() { | |
return a + b; | |
} |
通常類別的宣告會放到標頭檔裡,而成員函數的實作會放到實作檔中。
下面我們分成數個部分介紹 C++ 的類別
- 9.1 - 建構函數
- 9.2 - 初值串列
- 9.3 - explicit 指示詞
- 9.4 - private 成員
- 9.5 - protected 成員
- 9.6 - 存取函數與修改函數
- 9.7 - this 指標
- 9.8 - friend 成員
- 9.9 - static 成員
- 9.10 - static const 成員
- 9.11 - const 成員函數
- 9.12 - mutable 成員
- 9.13 - 巢狀類別
- 9.14 - Copy 建構函數
- 9.15 - 解構函數
- 9.16 - 多載運算子
- 9.17 - 繼承
- 9.18 - 多重繼承
- 9.19 - virtual 函數
- 9.20 - 虛擬繼承
- 9.21 - 摘要
continue ...
1 則留言:
"但是 private 成員不能被繼承 (inheritance) , protected 成員則可以被繼承。"
private 成員一樣被繼承,只是不能被直接取用吧!
張貼留言