380 likes | 523 Views
ä½•è¬‚çµæ§‹. 新的變數型態 使用關éµå— struct. struct çµæ§‹å稱 { … // çµæ§‹æˆå“¡ } ;. Example. 新的變數型態 ---BOOK. struc BOOK { char Title[80]; char Author[80]; char Publisher[80]; int Year; }; . BOOK Novel;. çµæ§‹åˆå§‹åŒ–. åˆå§‹å€¼æ”¾åœ¨å¤§æ‹¬è™Ÿä¸ 以逗點å€éš”. BOOK Novel= { “Paneless Programmingâ€,
E N D
何謂結構 • 新的變數型態 • 使用關鍵字struct struct結構名稱 { … //結構成員 };
Example • 新的變數型態---BOOK struc BOOK { char Title[80]; char Author[80]; char Publisher[80]; int Year; }; BOOK Novel;
結構初始化 • 初始值放在大括號中 • 以逗點區隔 BOOK Novel= { “Paneless Programming”, “I.C. Fingers”, “Gutter Press”, 1981 };
指定結構的成員 • 成員選擇運算子(member selection operation)或成員存取運算子(member access operator) • 一個點 • Ex: Novel.Year+=2;
Ex7_01.cpp • 結構的定義通常放在 “.h”檔中 • 使用#include假指令載入
鏈結串列 (Linked List) • Figure (p251)
配合結構使用指標 • 結構成員不允許是結構本身的型態 • 可以是指向此結構型態的指標 struct ListElement { RECT aRect; ListElement* pNextElement; };
間接成員選擇運算子 • “->” • (*pRect).Top += 10; • pRect->Top += 10;
Windows 程式設計 • p252 ~ p275 • WinMain() and WindowProc() • WinMain()-程式初始化, 程式執行起始點 • WindowProc()-處理應用程式的訊息
Chapter 8 運用類別建構自定資料
目標 • 何謂類別 • 宣告類別 • 建立使用類別的物件 • 類別成員存取控制權 • 內定建構子 • 參照類別內容 • 何謂拷貝建構子?如何製作
類別=結構? • 關鍵字class, public • 類別成員: 負責儲存資料的變數 • 定義新的資料型態
Public的意義 • 與結構不同處 • 表示類別成員存取權為共用(結構亦同) • 類別成員存取權也可以被限制
命名習慣-MFC • 類別名稱前加C • 類別資料成員前加m
類別定義 class類別名稱 { public: … //類別成員 };
Example class Box { public: double m_length; double m_Breath; double m_Height; } Cbox為類別的物件或實體 CBox bigBox;
類別中的運算式 • 類別成員 • 資料 • 函式:成員函式(member function) • Ex: 類別物件運用在C++標準運算式中 Cbox box1; Cbox box2; if (box1>box2) box1.fill(); else box2.fill();
了解類別 • 類別成員 • 資料成員 • 函式成員 • 定義類別並非真的定義資料 • 必須透過宣告物件
類別存取控制權 • public, private and protected • 類別成員存取屬性:省略-內定為private • 結構:內定為public
Ex8_02.cpp • 成員函式中使用資料成員, 不必指定物件名稱, 因為同屬一個物件 • 為指定物件名稱時, 會存取目前正在執行的函式物件的資料成員 • 每次宣告都會將類別函式copy一份 • 且類別函式在使用sizeof運算子時,不列入計算
定義成員函式的位置 • 成員函式不一定要放在類別定義中 • 放在其他地方, 在類別定義加入函式原型即可 class Cbox { public: double m_length; double m_Breadth; double m_Height; double Volume(void); }
定義成員函式的位置 (cont.) • 函式名稱前加上範圍解析運算子-兩個冒號“::” Double Cbox::Volume() { return m_Length*m_Breadth*m_Height; }
定義成員函式的位置 (cont.) • 行內涵式(inline function)--成員函式放在類別定義中 • 編譯器會將行內涵式展開 • 行內涵式適合程式碼較短且簡單的程式 • 執行速度較快 • 強制編譯器將函式當作行內涵式處理 • 將函式標題前加入關鍵字inline
Example inline double Cbox::Volume() { return m_Length*m_Breadth*m_Height; }
類別建構子 (constructor) • 類別中特別的函式 • 名稱與類別相同 • 每次宣告物件都會呼叫建構子Cbox()
類別建構子(cont.) • Ex8_03.cpp Cbox(double lv, double bv, double hv) { cout << endl << “Constructor called.”; m_Length = lv; m_Breadth = bv; m_Height = hv; } CBox box1(78.0, 24.0, 18.0 ) CBox cigarBox(8.0, 5.0, 1.0 )
內定的建構子 • 在Ex8_03.cpp加入 • CBox box2 () • 產生錯誤-編譯器找不到box2的內定建構子 • 建構子引數 • 沒有引數: 定義時無指定 • 引數可有可無: 未設定成資料的初始值 • Ex8_03.cpp類別定義已提供建構子, 編譯器認為使用找要自行負責建構子工作, 而不提供內定建構子
最簡化的建構子 • Ex8_04.cpp • 建構子可覆載 • 兩個建構子的差別只有參數列不同 • 一個為三個double的引數 • 一個沒有參數 Cbox() {}
在建構子中指定內定值 • Ex8_05.cpp
在建構子中使用初始化串列 • 宣告時以函式表示法來指定初始值 Cbox(double lv =1.0, double bv = 1.0, double hv = 1.0) :m_Length(lv), m_Breadth(bv), m_Height(hv) { cout << endl << “Constructor called.”; }
類別的私有成員 • 關鍵字private • 凡private類的成員只允許該類別的成員函式存取 • 一般函式無法存取 • 存取private資料成員唯一的方式 • 建構子 • 成員函式
存取private類別成員 • 保護 < > 保密 • 撰寫一成員函式讀取private成員的值 inline double Cbox::GetLength() { return m_Length; } len=box2.GetLength();
類別的夥伴函式(friend function) • 夥伴函式:有特權的全域函式 • 非成員函式 • 擁有特權存取“類別所有成員”的權利 • 關鍵字friend • 類別定義中加入夥伴函式的原型 • 或夥伴函式的整個函式定義 • 行內涵式
Ex8_07.cpp • 夥伴函式位於public及private所有類別成員後 • 並非類別成員, 不能直接使用資料成員名稱, 需加上物件名稱 • Ex: aBox.m_Length
夥伴函式使用注意事項 • 全域函式 • 避免將夥伴函式定義放在類別中 • ClassView中看不到