Presentation is loading. Please wait.

Presentation is loading. Please wait.

C++: 物件導向程式設計-使用類別(Class)

Similar presentations


Presentation on theme: "C++: 物件導向程式設計-使用類別(Class)"— Presentation transcript:

1 C++: 物件導向程式設計-使用類別(Class)
講師:林業峻 CSIE, NTU 3/28, 2015

2 課程大綱 類別 (Class) 物件導向 類別, 物件, 成員 權限 建構式與解構式 作業

3 C++物件導向 以物件為基礎的程式設計,將程式中互動的單元 視為一個個的物件。 封裝(Encapsulation)
封裝物件資訊是第一步,您要瞭解如何使用類別定義物件的 屬性、方法(行為) 類別是建構物件時所依賴的規格書。 例如設計一個物件: 人 屬性:姓名, 身高, 體重 行為:輸入資料, 輸出資料

4 類別(Class) 要訣: 類別class是C++中用來封裝資料的關鍵字
當使用類別來定義一個物件時,考慮這個物件可 能擁有的「屬性」與「方法」成員 屬性是物件的靜態描述 方法是可施加於物件上的動態操作 使用類別定義出這個物件的規格書,之後就可依 這個規格書製作出一個個的物件實例,並在製作 過程中設定個別物件的專屬特性資料。 要訣: 屬性宣告要存放的資料 (每個物件有自己的屬性) 方法寫要執行的函式 (通常用來操作物件的屬性)

5 類別(Class) 宣告一個類別 (類似定義一個結構struct) 語法:
class 類別名稱 {   public:    類別名稱(); //建構式, 用來做物件的初始化    ~類別名稱(); //解構式, 用來做物件的善後工作    公開的方法或屬性;   protected: // 只有在同一繼承架構中可以使用的資料    受保護的方法或屬性;   private: // 只有在此類別中可以使用的資料    私有的方法或屬性; };

6 物件的產生與使用 使用類別宣告物件 (類似宣告一個變數) 語法: 物件可透過 . 來使用或存取該方法或屬性(類似C語 言的結構struct)
類別名稱 物件名稱; 類別名稱 物件名稱( 參數1, 參數2, … , 參數n ); 物件可透過 . 來使用或存取該方法或屬性(類似C語 言的結構struct) 若為物件指標,可透過 ->來使用或存取該方法或 屬性

7 從一個簡單的例子開始 範例: 輸入兩個人資料(姓名, 身高, 體重)並印出 #include <iostream>
#include <string> using namespace std; class Person { public: void input() cin >> name; cin >> height; cin >> weight; } void output() cout << "Name:" << name << endl; cout << "Height:" << height << " cm" << endl; cout << "Weight:" << weight << " kg" << endl; string name; int height; int weight; }; int main() Person p1; Person p2; p1. input(); p1. output(); p2. input(); p2. output(); return 0;

8 類別的方法之描述 實作一個類別方法的內容(類似寫一個函式) 除了寫在類別定義中, 也可拿到類別定義以外的地 方描述 語法:
資料型態 類別名稱::方法名稱( 引數1,引數2, … ,引數n ) {   程式碼; }

9 如何設計類別? 思考 (以功能角度) 進階思考 (以使用者角度) 每個物件需要什麼資料? 每個物件需要什麼方法來操作資料?
如何讓使用類別的人方便簡單使用 如何避免使用類別的人因資料操作不當而產生錯誤

10 練習 設計一個Square(正方型)類別包含下列成員: 使用Square類別宣告兩個邊長為10與20的物件,並 印出它們的面績 屬性:
int len: 邊長 方法: int area(): 計算面績 使用Square類別宣告兩個邊長為10與20的物件,並 印出它們的面績

11 資料的權限 最重要的是別忘了在最後加上分號,初學C++的 新手很常犯這個錯誤
public這個關鍵字,它表示以下所定義的成員可 以使用物件名稱直接被呼叫,稱之為「公開成員 」 private關鍵字下的則是「私有成員」,不可以透 過物件名稱直接呼叫。 在類別封裝時,有一個基本原則是:資訊的最小 化公開。如果屬性可以不公開就不公開,如果要 取得或設定物件的某些屬性,也是儘量透過方法 成員來進行。

12 資料的權限 思考: 由上一個輸入兩個人資料(姓名, 身高, 體重) 並印出的範例, 你希望Person產生的物件只能用 input與output函式來輸入輸出資料, 該如何達到 此功能? 使用private成員!

13 資料的權限 範例: #include <iostream> #include <string>
using namespace std; class Person { public: void input() cin >> name; cin >> height; cin >> weight; } void output() cout << "Name:" << name << endl; cout << "Height:" << height << " cm" << endl; cout << "Weight:" << weight << " kg" << endl; private: string name; int height; int weight; }; int main() Person p1; Person p2; p1. input(); //p1. height = 0; //這行不能執行! p1. output(); p2. input(); p2. output(); return 0;

14 練習 設計一個Square(正方型)類別包含下列成員: 使用Square類別宣告兩個邊長為10與20的物件,並 印出它們的面績
屬性 (私有): int len: 邊長 方法 (公開): int area(): 計算面績 void setLen(int n): 設定邊長 (需判斷邊長值的正確性) int getLen(): 取得邊長 使用Square類別宣告兩個邊長為10與20的物件,並 印出它們的面績

15 建構式與解構式 在定義類別時,您可以使用建構函式 (Constructor)來進行物件的初始化
而在物件釋放資源之前,您也可以使用「解構函 式」(Destructor)來進行一些善後的工作

16 建構式 思考: 由上一個輸入兩個人資料(姓名, 身高, 體重) 並印出的範例, 你希望一開始姓名為No name, 身 高與體重為0, 該如何達到此功能? 使用建構式!

17 建構式 #include <iostream> #include <string>
using namespace std; class Person { public: Person() name = "No name"; height = 0; weight = 0; } void input() cin >> name; cin >> height; cin >> weight; void output() cout << "Name:" << name << endl; cout << "Height:" << height << " cm" << endl; cout << "Weight:" << weight << " kg" << endl; private: string name; int height; int weight; }; int main() Person p1; Person p2; //p1. input(); //p1忘了輸入 p1. output(); //p1印出No name p2. input(); p2. output(); return 0;

18 重載建構式 #include <iostream> #include <string>
using namespace std; class Person { public: Person() name = "No name"; height = 0; weight = 0; } Person(string n, int h, int w) name = n; height = h; weight = w; void input() cin >> name; cin >> height; cin >> weight; void output() cout << "Name:" << name << endl; cout << "Height:" << height << " cm" << endl; cout << "Weight:" << weight << " kg" << endl; private: string name; int height; int weight; }; int main() Person p1; Person p2("Andy", 180, 80); p1. output(); p2. output(); return 0;

19 解構式 範例: 物件結束時印出ByeBye #include <iostream>
#include <string> using namespace std; class Person { public: Person() name = "No name"; height = 0; weight = 0; } ~Person() cout << "ByeBye" << endl; void input() cin >> name; cin >> height; cin >> weight; void output() cout << "Name:" << name << endl; cout << "Height:" << height << " cm" << endl; cout << "Weight:" << weight << " kg" << endl; private: string name; int height; int weight; }; int main() Person p1; p1. output(); return 0;

20 練習 設計一個Square(正方型)類別包含下列成員: 使用Square類別宣告兩個邊長為10與20的物件,並 印出它們的面績
屬性 (私有): int len: 邊長 方法 (公開): Square(): 建構式, 將邊長設為0 int area(): 計算面績 void setLen(int n): 設定邊長 (需判斷邊長值的正確性) int getLen(): 取得邊長 使用Square類別宣告兩個邊長為10與20的物件,並 印出它們的面績

21 課程大綱 類別 (Class) 作業

22 eCash程式 要求: 設計一類別eCash模擬儲值卡的行為 私有成員: 公開成員: 主程式
屬性: Money 目前可用金額 公開成員: 方法: eCash() 建構式 (將Money初始化為0元) 方法: void store(int m) 儲值 (將m存入Money中) 方法: void pay(int m) 消費 (將Money消費m元) (提醒: 需判斷目前eCash是否有足夠的金額消費) 方法: void display() 顯示目前餘額 (將Money輸出於螢幕) 主程式 輸入’s’: 儲值 輸入’p’: 消費 輸入’d’:查詢餘額 輸入’q’: 離開程式 範例:

23 範例 Example:程式開始 === 歡迎使用eCash === 您好,請選擇項目: s: 儲值 p: 消費 d: 顯示餘額 q: 離開
>

24 範例 Example:儲值 您好,請選擇項目: s: 儲值 p: 消費 d: 顯示餘額 q: 離開 > s 請輸入儲存金額: 500
eCash: 您存了500元 您好,請選擇項目: s: 儲值 p: 消費 d: 顯示餘額 q: 離開 > s 請輸入儲存金額: -100 eCash: 請輸入大餘0的金額

25 範例 Example:消費 您好,請選擇項目: s: 儲值 p: 消費 d: 顯示餘額 q: 離開 > p 請輸入消費金額: 150
eCash: 您花了150元 您好,請選擇項目: s: 儲值 p: 消費 d: 顯示餘額 q: 離開 > p 請輸入消費金額: -100 eCash: 請輸入大餘0的金額 您好,請選擇項目: s: 儲值 p: 消費 d: 顯示餘額 q: 離開 > p 請輸入消費金額: 1000 eCash: 您的錢不夠

26 範例 Example:查詢餘額 您好,請選擇項目: s: 儲值 p: 消費 d: 顯示餘額 q: 離開 > d
eCash: 您尚有350元

27 範例 Example:離開 您好,請選擇項目: s: 儲值 p: 消費 d: 顯示餘額 q: 離開 > q 謝謝,ByeBye!
Press any key to continue

28 繳交 使用FTP上傳 請使用FileZilla上傳作業至指定FTP主機 繳交期限:2015. 4/11(六) 主機: 使用者名稱: 密碼:
連接埠: 將程式存到自己學號之資料夾 (請自行新增) 檔名: 251XX_hw4_##.cpp XX為學號, ##為版本編號 Ex: _hw4_01.cpp (25100號同學 作業4 第1版) 請使用FileZilla上傳作業至指定FTP主機 繳交期限: /11(六) 公佈解答後,不再收作業


Download ppt "C++: 物件導向程式設計-使用類別(Class)"

Similar presentations


Ads by Google