Microsoft PowerPoint - 11_Templates.ppt

Similar documents
c_cpp

新版 明解C++入門編

運算子多載 Operator Overloading

Strings

FY.DOC

ebook39-5

C/C++语言 - C/C++数据

Template

Chapter12 Derived Classes

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

Microsoft PowerPoint - 09_Inheritance.ppt

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

C++ 程式設計

運算子多載 Operator Overloading

Microsoft Word - ch04三校.doc

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

提问袁小兵:

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

untitled

全国计算机技术与软件专业技术资格(水平)考试

第3章.doc

untitled

Microsoft Word - 物件導向編程精要.doc

untitled

untitled

Scott Effective C++ C++ C++ Roger Orr OR/2 ISO C++ Effective Modern C++ C++ C++ Scoot 42 Bart Vandewoestyne C++ C++ Scott Effective Modern C++ Damien

untitled

ebook39-6

Microsoft Word 軟體設計第二部份範例試題_C++_ _1_.doc

運算子多載 Operator Overloading

Microsoft Word - 01.DOC

C/C++ 语言 - 循环

概述

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

Strings

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

Microsoft Word cppFinalSolution.doc

Microsoft Word - data_mid1611_and_sol.docx

第七讲 继承与多态

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

Microsoft PowerPoint - 10 模板 Template.pptx

untitled

第二章 簡介類別

Open topic Bellman-Ford算法与负环

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Microsoft PowerPoint - string_kruse [兼容模式]

PowerPoint Presentation

Microsoft PowerPoint - Class5.pptx

Factory Methods

C 1

Microsoft PowerPoint - L17_Inheritance_v4.pptx

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

Microsoft PowerPoint - 13_Exception.ppt

CC213

Microsoft Word - DataStruct-981.doc

Microsoft Word - CPE考生使用手冊 docx

C

untitled

The golden pins of the PCI card can be oxidized after months or years

新・明解C言語入門編『索引』

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Java

Microsoft Word - MSP430 Launchpad 指导书.docx

51 C 51 isp 10 C PCB C C C C KEIL

untitled

Microsoft PowerPoint - Fig03_Stack.ppt [相容模式]

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

The Embedded computing platform

C/C++语言 - 分支结构

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

_汪_文前新ok[3.1].doc

Microsoft PowerPoint - 13_ClassAndObj.ppt

全国计算机技术与软件专业技术资格(水平)考试

Chapter 8 - Operator Overloading

汇集全球21位医生的经验和智慧,总结出最实用的专业建议,这些都是最值得你牢记的健康提醒

1 行 业 发 展 不 平 衡 我 国 房 地 产 中 介 服 务 业 起 步 较 晚, 专 业 分 工 程 度 和 国 外 发 达 国 家 相 比 还 有 很 大 差 距 房 地 产 中 介 服 务 行 业 的 发 展 水 平 与 房 地 产 开 发 行 业 的 市 场 化 水 平 密 切 相 关

一. 城市 3

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

( 总 第 1073 期 ) 浙 江 省 人 民 政 府 主 办 2015 年 3 月 17 日 出 版 省 政 府 令 省 政 府 文 件 目 录 浙 江 省 大 型 群 众 性 活 动 安 全 管 理 办 法 ( 浙 江 省 人 民 政 府 令 第 333 号 ) (3) 浙 江 省 人 民 政

chap07.key

untitled

学习MSP430单片机推荐参考书

Microsoft PowerPoint - 07-overloaded.ppt

Microsoft Word - well_game.doc

Microsoft PowerPoint - C++類別.ppt

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

Microsoft Word - 第7章 类与对象.docx

EJB-Programming-3.PDF

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

Chapter 9: Objects and Classes

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

Strings

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

1.5招募说明书(草案)

踏出C++的第一步

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

Transcription:

1 1. 上機考 20% 期末考 6/23( 四 ) 晚 6:30~8:30 範圍 : 第 7, 8, 9, 10 章實習內容 按座位坐, 隨機抽兩題 2. 紙上測驗 20% 6/21( 二 ) :9:30~11:00 課本 7-11, 13 章內容 2 第 11 章樣版 (Templates) 11.1 簡介 11.2 函式樣版 11.3 多載函式樣版 11.4 類別樣版 11.5 類別樣版與無型 (Nontype) 參數 11.6 樣版與繼承 11.7 樣版與夥伴 (Friends) 關係 11.8 樣版與靜態成員 1

3 樣版 (Templates) 11.1 簡介 函式樣版 (Function Templates) 用來建構功能相同的函式 類別樣版 (Class Templates) 用來建構功能相同的類別 4 11.2 函式樣版 多載函式與函式樣版 多載函式 具相似運算 - 不同資料型態 針對一個 signature 撰寫一個函式 函式樣版 具相同運算 - 不同資料型態 只需撰寫一個函式樣版 編譯器會產生多個不同的函式 型態檢查 2

5 11.2 函式樣版 函式樣版定義 關鍵字 :template 在 < > 括號內列出型態參數 型態參數前使用關鍵字 class 或 typename class 和 typename 可互換 template< class T > template< typename ElementType > template< class BorderType, class FillType > 可用來表示多種型態的 參數, 傳回資料, 或函式內變數 1 // Fig. 11.1: fig11_01.cpp 2 // 使用樣版 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 // 定義樣版函式 printarray 9 template< class T > // 設定一個型態 T 10 void printarray( const T *array, const int count ) 11 { 12 for ( int i = 0; i < count; i++ ) 13 cout << array[ i ] << " "; 14 15 cout << endl; 16 17 } // end function printarray 18 19 int main() 20 { 21 const int acount = 5; 22 const int bcount = 7; 23 const int ccount = 6; 24 fig11_01.cpp (1 of 2) 6 3

25 int a[ acount ] = { 1, 2, 3, 4, 5 }; 26 double b[ bcount ] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7}; 27 char c[ ccount ] = HELLO ; // 第 6 個位置是 0 28 29 cout << "Array a contains:" << endl; 30 31 // a 是 int 陣列, 樣版函式會產生一個 T=int 的函式 32 printarray( a, acount ); 33 34 cout << "Array b contains:" << endl; 35 36 // b 是 double 陣列, 樣版函式會產生一個 T=double 的函式 37 printarray( b, bcount ); 38 39 cout << "Array c contains:" << endl; 40 41 // c 是 char 陣列, 樣版函式會產生一個 T=char 的函式 42 printarray( c, ccount ); 43 44 return 0; 45 46 } // end main fig11_01.cpp (2 of 2) 7 Array a contains: 1 2 3 4 5 Array b contains: 1.1 2.2 3.3 4.4 5.5 6.6 7.7 Array c contains: H E L L O fig11_01.cpp output (1 of 1) 8 4

9 11.3 多載函式樣版 函式樣版 產生的函式都有相同名字 編譯器使用多載方式 多載函式樣版 參數不同 可宣稱多個名稱一樣的函式樣版 可宣稱具相同名稱的非樣版函式 編譯器會執行對映程序 試著找到最符合的函式與參數型態 10 Stack 11.4 類別樣版 LIFO( 後進先出 ) 結構 針對一種資料型態必須定義一個類別 使用類別樣版 (Class templates) 設計一個通用的 stack 類別 可產生多種資料型態的 stack 類別 將資料型態參數化 需要一或多個資料型態參數 自訂 通用類別 " 樣版 5

1 // Fig. 11.2: tstack1.h 2 // Stack 類別定義 - 類別樣版 3 #ifndef TSTACK1_H 4 #define TSTACK1_H 5 6 template< class T > // 使用樣版, 定義一個型態參數 T 7 class Stack { 8 9 public: 10 Stack( int = 10 ); // 內定建構子, 設定 stack 大小 11 12 // 解構子 13 ~Stack() 14 { 15 delete [] stackptr; 16 17 } // end ~Stack destructor 18 19 bool push( const T& ); // 將一個型態為 T 的資料加入 stack 20 bool pop( T& ); // 由 stack 中取出資料型態為 T 的元素 21 22 // 檢查 stack 是不是空的 23 bool isempty() const 24 { 25 return top == -1; 26 27 } // end function isempty 28 tstack1.h (1 of 3) 11 29 // 檢查 stack 是不是滿的 30 bool isfull() const 31 { 32 return top == size - 1; 33 34 } // end function isfull 35 36 private: 37 int size; // stack 大小 38 int top; // 最上面元素的位置 39 T *stackptr; // stack 資料的指標 40 41 }; // end class Stack 42 43 // 建構子 44 template< class T > // 這裏也要寫一次 45 Stack< T >::Stack( int s )// 類別名稱改用 Stack< T > 46 { 47 size = s > 0? s : 10; 48 top = -1; // Stack 一開始沒有資料 49 stackptr = new T[ size ]; // 配置記憶體 50 51 } // end Stack constructor 52 tstack1.h (2 of 3) 12 6

53 // 將資料加入 stack 54 // 成功傳回 true; 失敗傳回 false 55 template< class T > 56 bool Stack< T >::push( const T &pushvalue ) 57 { 58 if (!isfull() ) {// 如果還沒滿 59 stackptr[ ++top ] = pushvalue; // 將資料放入 Stack 60 return true; // 成功 61 62 } // end if 63 64 return false; // 失敗 65 66 } // end function push 67 68 // 從 stack 取出一筆資料 ; 69 // 成功傳回 true; 失敗傳回 false 70 template< class T > 71 bool Stack< T >::pop( T &popvalue ) 72 { 73 if (!isempty() ) {// 如果還有資料 74 popvalue = stackptr[ top-- ]; // 取出資料 75 return true; // 成功 76 77 } // end if 78 79 return false; // 失敗 80 81 } // end function pop 82 83 #endif tstack1.h (3 of 3) 13 1 // Fig. 11.3: fig11_03.cpp 2 // Stack 類別測試程式 1 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 #include tstack1.h // 引用 Stack 類別定義 10 11 int main() 12 { 13 Stack< double > doublestack( 5 );// 宣稱一個 double stack 物件 14 double doublevalue = 1.1; 15 16 cout << "Pushing elements onto doublestack\n"; 17 // 將資料放入 stack, 直到 stack 滿 18 while ( doublestack.push( doublevalue ) ) { 19 cout << doublevalue << ' '; 20 doublevalue += 1.1; 21 22 } // end while 23 24 cout << "\nstack is full. Cannot push " << doublevalue 25 << "\n\npopping elements from doublestack\n"; 26 // 由 stack 取出資料, 直到 stack 空 27 while ( doublestack.pop( doublevalue ) ) 28 cout << doublevalue << ' '; 29 30 cout << "\nstack is empty. Cannot pop\n"; fig11_03.cpp (1 of 2) 14 7

31 // 宣稱一個 int stack 物件 32 Stack< int > intstack; 33 int intvalue = 1; 34 cout << "\npushing elements onto intstack\n"; 35 // 將資料放入 stack, 直到 stack 滿 36 while ( intstack.push( intvalue ) ) { 37 cout << intvalue << ' '; 38 ++intvalue; 39 40 } // end while 41 42 cout << "\nstack is full. Cannot push " << intvalue 43 << "\n\npopping elements from intstack\n"; 44 // 由 stack 取出資料, 直到 stack 空 45 while ( intstack.pop( intvalue ) ) 46 cout << intvalue << ' '; 47 48 cout << "\nstack is empty. Cannot pop\n"; 49 50 return 0; 51 52 } // end main fig11_03.cpp (2 of 2) 15 Pushing elements onto doublestack 1.1 2.2 3.3 4.4 5.5 Stack is full. Cannot push 6.6 Popping elements from doublestack 5.5 4.4 3.3 2.2 1.1 Stack is empty. Cannot pop Pushing elements onto intstack 1 2 3 4 5 6 7 8 9 10 Stack is full. Cannot push 11 Popping elements from intstack 10 9 8 7 6 5 4 3 2 1 Stack is empty. Cannot pop fig11_03.cpp (3 of 3) 16 fig11_03.cpp output (1 of 1) 8

1 // Fig. 11.4: fig11_04.cpp 2 // Stack 類別測試程式二 3 // 使用函式樣版處理 Stack< T > 類別 4 #include <iostream> 5 6 using std::cout; 7 using std::cin; 8 using std::endl; 9 10 #include tstack1.h // 引用 Stack 類別樣版定義 11 12 // 定義一個函式樣版處理 Stack< T > 類別 13 template< class T > 14 void teststack( 15 Stack< T > &thestack, // Stack< T > 的 reference 16 T value, // stack 的初始值 17 T increment, // 遞增值 18 const char *stackname ) // Stack < T > 物件名稱 19 { 20 cout << "\npushing elements onto " << stackname << '\n'; 21 22 while ( thestack.push( value ) ) { 23 cout << value << ' '; 24 value += increment; 25 26 } // end while fig11_04.cpp (1 of 2) 17 27 28 cout << "\nstack is full. Cannot push " << value 29 << "\n\npopping elements from " << stackname << '\n'; 30 31 while ( thestack.pop( value ) ) 32 cout << value << ' '; 33 34 cout << "\nstack is empty. Cannot pop\n"; 35 36 } // end function teststack 37 38 int main() 39 { 40 Stack< double > doublestack( 5 ); 41 Stack< int > intstack; 42 43 teststack( doublestack, 1.1, 1.1, "doublestack" ); 44 teststack( intstack, 1, 1, "intstack" ); 45 46 return 0; 47 48 } // end main fig11_04.cpp (2 of 2) 18 9

Pushing elements onto doublestack 1.1 2.2 3.3 4.4 5.5 Stack is full. Cannot push 6.6 Popping elements from doublestack 5.5 4.4 3.3 2.2 1.1 Stack is empty. Cannot pop 19 fig11_04.cpp output (1 of 1) Pushing elements onto intstack 1 2 3 4 5 6 7 8 9 10 Stack is full. Cannot push 11 Popping elements from intstack 10 9 8 7 6 5 4 3 2 1 Stack is empty. Cannot pop 20 11.5 類別樣版與非型態參數 類別樣版 非型態參數 預設參數 被當成 const 例如 : template< class T, int elements > Stack< double, 100 > mostrecentsalesfigures; 宣稱資料型態為 Stack< double, 100> 的物件 型態參數 預設型態 例如 : template< class T = string > 10

21 11.5 類別樣版與非型態參數 多載類別樣版 特定型態的類別 不符合一般的類別樣版 例如 : template<> Class Array< Martian > { }; 22 11.6 樣版與繼承 樣版與繼承有幾種關係 類別樣版繼承一般類別 一般類別繼承類別樣版產生的類別 類別樣版繼承類別樣版產生的類別 11

23 11.7 樣版與夥伴 (friend) 函式 類別樣版的 friend 關係 全域函式 其它類別的成員函式 整個類別 24 11.7 樣版與夥伴 (friend) 函式 friend 函式 template< class T > class X friend void f1(); f1() 是所有類別樣版產生之類別的 friend friend void f2( X< T > & ); f2( X< float > &) 只是 X< float > 的 friend, f2( X< double > & ) 只是 X< double > 的 friend, f2( X< int > & ) 只是 X< int > 的 friend, 12

25 11.7 樣版與夥伴 (friend) 函式 friend 函式 template< class T > class X friend void A::f4(); 類別 A 的成員函式 f4 是所有類別樣版產生之類別的 friend friend void C< T >::f5( X< T > & ); 成員函式 C<float>::f5( X< float> & ) 只會是 X<float> 的夥伴函式 26 11.7 樣版與夥伴 (friend) 函式 friend 類別 template< class T > class X friend class Y; 類別 Y 是每一種類別的 friend friend class Z<T>; class Z<float> 只是類別 X<float> 的 friend. 13

27 11.8 樣版與靜態 (static) 成員 非樣版類別 (Non-template class) 一個類別只存在一份靜態資料成員 所有屬於同一類別的物件共用 類別樣版 所產生的每個類別有一份靜態資料成員 靜態變數必須在檔案內初始化 實作類別成員函式的檔案 14