1 / 48

覆載函式 (function overloading)

覆載函式 (function overloading). double maxdouble(double array[], int len) { double max = array[0] for(int i=1; i<len; i++) if (max < array[i]) max = array[i]; retrun max; }. how about long, int, …etc. 覆載函式 (cont.). 相同名稱的一系列函式 各有不同的參數列 注意 ! 僅有傳回值不同 , 並不足以區分函式 !!.

Download Presentation

覆載函式 (function overloading)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 覆載函式(function overloading) double maxdouble(double array[], int len) { double max = array[0] for(int i=1; i<len; i++) if (max < array[i]) max = array[i]; retrun max; } • how about long, int, …etc.

  2. 覆載函式 (cont.) • 相同名稱的一系列函式 • 各有不同的參數列 • 注意!僅有傳回值不同, 並不足以區分函式!!

  3. Example Ex6_06.cpp int max(int array[], int len); // Prototypes for long max(long array[], int len); // a set of overloaded double max(double array[], int len); // functions

  4. 覆載函式的意義 • 相同運算式使用相同函式名稱處理不同運算元 • Ex: “+” 對int, long, double, … • 實質上相同, 但引數型態不同, 都應覆載, 使用相同函式名稱

  5. 函式樣板 (Function Templates) • 函式具有不同變數及參數型態 • 程式碼相同 • 一群特定程式碼 • 依照參數型態不同自動產生不同的版本

  6. 使用函式樣板改寫 max() // Template for function to compute the maximum element of an array template<class T> T max(T x[], int len) { T max = x[0]; for(int i=1; i<len; i++) if(max<x[i]) max = x[i]; return max; } • 關鍵字template表示樣板定義 • <參數型態> • 由樣板建立的函式實體稱為實例(instantiation)

  7. Example Ex6_07.cpp #include <iostream> using namespace std; // Template for function to compute the maximum element of an array template<class T> T max(T x[], int len) { T max = x[0]; for(int i=1; i<len; i++) if(max<x[i]) max = x[i]; return max; } int main(void) { int small[] = { 1,24,34,22}; long medium[] = { 23,245,123,1,234,2345}; double large[] = { 23.0,1.4,2.456,345.5,12.0, 21.0}; int lensmall = sizeof small/sizeof small[0]; int lenmedium = sizeof medium/sizeof medium[0]; int lenlarge = sizeof large/sizeof large[0]; cout << endl << max(small, lensmall); cout << endl << max(medium, lenmedium); cout << endl << max(large, lenlarge); cout << endl; return 0; }

  8. Homework • reading example p224~239 • 6-1, 6-2

  9. Chapter 7 舊式Windows的滋味

  10. 目標 • 結構 • 視窗基本架構 • Windows API • Windows message • Windows程式常用表示法 • Windows程式基本架構

  11. 何謂結構 • 新的變數型態 • 使用關鍵字struct struct結構名稱 { … //結構成員 };

  12. Example • 新的變數型態---BOOK struc BOOK { char Title[80]; char Author[80]; char Publisher[80]; int Year; }; BOOK Novel;

  13. 結構初始化 • 初始值放在大括號中 • 以逗點區隔 BOOK Novel= { “Paneless Programming”, “I.C. Fingers”, “Gutter Press”, 1981 };

  14. 指定結構的成員 • 成員選擇運算子(member selection operation)或成員存取運算子(member access operator) • 一個點 • Ex: Novel.Year+=2;

  15. Ex7_01.cpp • 結構的定義通常放在 “.h”檔中 • 使用#include假指令載入

  16. 鏈結串列 (Linked List) • Figure (p251)

  17. 配合結構使用指標 • 結構成員不允許是結構本身的型態 • 可以是指向此結構型態的指標 struct ListElement { RECT aRect; ListElement* pNextElement; };

  18. 間接成員選擇運算子 • “->” • (*pRect).Top += 10; • pRect->Top += 10;

  19. Windows 程式設計 • p252 ~ p275 • WinMain() and WindowProc() • WinMain()-程式初始化, 程式執行起始點 • WindowProc()-處理應用程式的訊息

  20. Chapter 8 運用類別建構自定資料

  21. 目標 • 何謂類別 • 宣告類別 • 建立使用類別的物件 • 類別成員存取控制權 • 內定建構子 • 參照類別內容 • 何謂拷貝建構子?如何製作

  22. 類別=結構? • 關鍵字class, public • 類別成員: 負責儲存資料的變數 • 定義新的資料型態

  23. Public的意義 • 與結構不同處 • 表示類別成員存取權為共用(結構亦同) • 類別成員存取權也可以被限制

  24. 命名習慣-MFC • 類別名稱前加C • 類別資料成員前加m_

  25. 類別定義 class類別名稱 { public: … //類別成員 };

  26. Example class CBox { public: double m_Length; double m_Breath; double m_Height; } Cbox為類別的物件或實體 CBox bigBox;

  27. 類別中的運算式 • 類別成員 • 資料 • 函式:成員函式(member function) • Ex: 類別物件運用在C++標準運算式中 Cbox box1; Cbox box2; if (box1>box2) box1.fill(); else box2.fill();

  28. 了解類別 • 類別成員 • 資料成員 • 函式成員 • 定義類別並非真的定義資料 • 必須透過宣告物件

  29. 類別存取控制權 • public, private and protected • 類別成員存取屬性:省略-內定為private • 結構:內定為public

  30. Ex8_01.cpp

  31. Ex8_02.cpp • 成員函式中使用資料成員, 不必指定物件名稱, 因為同屬一個物件 • 為指定物件名稱時, 會存取目前正在執行的函式物件的資料成員 • 每次宣告都會將類別函式copy一份 • 且類別函式在使用sizeof運算子時,不列入計算

  32. 定義成員函式的位置 • 成員函式不一定要放在類別定義中 • 放在其他地方, 在類別定義加入函式原型即可 class Cbox { public: double m_length; double m_Breadth; double m_Height; double Volume(void); }

  33. 定義成員函式的位置 (cont.) • 函式名稱前加上範圍解析運算子-兩個冒號“::” Double Cbox::Volume() { return m_Length*m_Breadth*m_Height; }

  34. 定義成員函式的位置 (cont.) • 行內涵式(inline function)--成員函式放在類別定義中 • 編譯器會將行內涵式展開 • 行內涵式適合程式碼較短且簡單的程式 • 執行速度較快 • 強制編譯器將函式當作行內涵式處理 • 將函式標題前加入關鍵字inline

  35. Example inline double Cbox::Volume() { return m_Length*m_Breadth*m_Height; }

  36. 類別建構子 (constructor) • 類別中特別的函式 • 名稱與類別相同 • 每次宣告物件都會呼叫建構子Cbox()

  37. 類別建構子(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 )

  38. 內定的建構子 • 在Ex8_03.cpp加入 • CBox box2 () • 產生錯誤-編譯器找不到box2的內定建構子 • 建構子引數 • 沒有引數: 定義時無指定 • 引數可有可無: 未設定成資料的初始值 • Ex8_03.cpp類別定義已提供建構子, 編譯器認為使用找要自行負責建構子工作, 而不提供內定建構子

  39. 最簡化的建構子 • Ex8_04.cpp • 建構子可覆載 • 兩個建構子的差別只有參數列不同 • 一個為三個double的引數 • 一個沒有參數 Cbox() {}

  40. 在建構子中指定內定值 • Ex8_05.cpp

  41. 在建構子中使用初始化串列 • 宣告時以函式表示法來指定初始值 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.”; }

  42. 類別的私有成員 • 關鍵字private • 凡private類的成員只允許該類別的成員函式存取 • 一般函式無法存取 • 存取private資料成員唯一的方式 • 建構子 • 成員函式

  43. Ex8_06.cpp

  44. 存取private類別成員 • 保護 < > 保密 • 撰寫一成員函式讀取private成員的值 inline double Cbox::GetLength() { return m_Length; } len=box2.GetLength();

  45. 類別的夥伴函式(friend function) • 夥伴函式:有特權的全域函式 • 非成員函式 • 擁有特權存取“類別所有成員”的權利 • 關鍵字friend • 類別定義中加入夥伴函式的原型 • 或夥伴函式的整個函式定義 • 行內涵式

  46. Ex8_07.cpp • 夥伴函式位於public及private所有類別成員後 • 並非類別成員, 不能直接使用資料成員名稱, 需加上物件名稱 • Ex: aBox.m_Length

  47. 夥伴函式使用注意事項 • 全域函式 • 避免將夥伴函式定義放在類別中 • ClassView中看不到

  48. 內定拷貝建構子

More Related