OOP9 類別Class
物件導向式問題分析 傳統的程式設計方式-「程序導向」式的設計方法 物件導向式的設計方法 「功能」為何? 那些「程序」可以完成這些功能? 找出「物件」(Object) 物件就是”東西” 訊息傳遞(Message Passing)
物件導向程式語言 物件導向語言(OOP),主要用來描述一個物件(Object)的類別(Class),以及如何達成所謂動態繫結(Dynamic Binding) 、同名異式(Polymorphism)、覆蓋(Override)、覆載(Overload)、類別的繼承(Inheritance)等等機制 常見的物件導向程式語言 C++ Java Smalltalk ObjectPascal
Object 類別Class object’s attribute(物件的屬性)有2個 Data(資料), property (Java中稱為field) 又稱”成員變數”Member variable (或data variable) Method 又稱”成員函數” Member function
物件導向程式語言 物件導向程式語言的優點 模組化設計(Module Design) 獨立且合作 容易維護(Easy to maintain) 可重複使用Reuse / Software IC
類別Class 本章主題 類別(Class)的宣告 操作成員(Operator Member)的定義與行內函式(Inline function) 建構元(Constructor)與解構元(Destructor) 合成使用類別 靜態的類別成員
類別的宣告 回顧結構(struct)定義
類別的宣告 class 類別名稱 { private: 型別 成員資料 ; public: 傳回值 成員函式1(傳入值……); 傳回值 成員函式2(傳入值……) //成員函式2 為一連線函式。 { //程式碼 } }; 傳回值 類別名稱::成員函式1(傳入值……) { //程式碼 } 類別名稱 變數名稱1; 類別名稱 變數名稱2; 變數名稱1.成員函式1(傳入值……);
類別的宣告
類別的使用 類別變數 - 案例/物件 public與private存取等級 不允許直接存取private資料成員
操作成員的定義 操作成員的定義: 定義函式的內容
行內函式 行內函式: 將操作成員的定義(函式的內容)寫在類別的定義中
行內函式 行內函式: 將操作成員的定義(函式的內容)寫在類別的定義之中
行內函式 使用inline保留字將操作成員定義成為行內函式
建構元(Constructor) 建構元是與類別同名稱的成員函式(member function),主要是用來進行資料成員的初始值設定(Initial value setting) 一個類別可以定義多個建構元,用以提供不同的初始化方式 建構元是不允許指定函式回傳資料型態
建構元(Constructor) class 類別名稱 { private: 型別 成員資料 ; public: 類別名稱( void ); // 建構子函式1 類別名稱(傳入值……); // 建構子函式2 傳回值 成員函式1(傳入值……); 傳回值 成員函式2(傳入值……) //成員函式2 為一連線函式。 { //程式碼 } ~類別名稱( ); //解構元函式 }; 類別名稱 變數名稱1; //會呼叫"建構子函式1" 類別名稱 變數名稱2(傳入值……); //會呼叫"建構子函式2"
預設引數建構元 當呼叫建構元時,若無提供足夠的參數值,建構元會以預設的引數值做為初始值
解構元(DeConstructor) 解構元的名稱與建構元相同,但名稱前面須加上 ~ 符號 解構元的作用與建構元剛好相反,它主要用來釋放物件所佔用的記憶體空間 解構元不接受任何參數,也不傳回任何值 一個類別只允許定義一個解構元
解構元 – 範例
解構元 – 範例
合成使用類別 在一個類別中使用其他類別作為其資料成員的一員
靜態的類別資料成員 靜態(Static)資料成員: 所有的類別案例共用一個資料
靜態的類別資料成員 class 類別名稱 { private: 型別 成員資料 ; static 型別 靜態成員資料 ; //只有宣告而己 public: 傳回值 成員函式1(傳入值……); }; 型別 類別名稱::靜態成員資料 ; //定義靜態成員資料
靜態資料成員
靜態的類別資料 靜態類別資料 當成員資料為定義成靜態時,每一個物件,都只有一個共用的靜態資料項。當同類別的全部物件需要共同的資料訊息時,靜態變數便顯得特別有用。靜態資料成員變數的特性和一般靜態變數一樣,雖然僅可在類別中被參考,但生命週期卻和整個程式相同。
CLASS class是一個使用者自訂的型態,正式物件導向程式設計的主要觀念,它們允許你隱藏程式的部分功能,限制部份成員的外部存取,達到封裝的目的 和structure不一樣, 包含資料與函式 class class_name { class_member_declaration_list }; 定義的成員預設為私有的(private)
CLASS class class_name { private: class screen declaration_list; { public: protected: }; class screen { private: int m_nWidth; int m_nHeight; int m_x; int m_y; protected: ~screen(); public: screen(); //可有多個不同的constructor void moveto(int, int) void resize(int, int); };
CLASS #include “screen.h” void screen::resize(int w, int h) { m_nWidth=w; m_nHeight=h; } void screen::move(int x, int y)
CLASS screen myScreen; //啟動constructor screen bufScreen=myScreen; //拷貝所有資料成員 screen* ptr= new screen; myScreen=*ptr; ptr=&bufScreen; screen s(20, 90); screen *ps=new screen(20, 90); myScreen.moveto(10,20) ps->moveto(10,20)
this 指標 void screen::resize(int w, int h) { this->m_nWidth=w; this->m_nHeight=h; } screen& screen::xxx() return *this;
static類別成員 有時候同一類別的所有抽象體必須要能存取到同一個共用的變數 class chatroom { private: static int m_nCount; } Const int m_nT;