第10章 類庫和C++的標(biāo)準(zhǔn)模板庫STL.ppt_第1頁
第10章 類庫和C++的標(biāo)準(zhǔn)模板庫STL.ppt_第2頁
第10章 類庫和C++的標(biāo)準(zhǔn)模板庫STL.ppt_第3頁
第10章 類庫和C++的標(biāo)準(zhǔn)模板庫STL.ppt_第4頁
第10章 類庫和C++的標(biāo)準(zhǔn)模板庫STL.ppt_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、C+面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)內(nèi)容,第1章 C+概述 第2章 類和對(duì)象 第3章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述 第4章 進(jìn)一步學(xué)習(xí)類和對(duì)象 第5章 堆與復(fù)制構(gòu)造函數(shù) 第6章 繼承性:派生類 第7章 運(yùn)算符重載 第8章 虛函數(shù)和多態(tài)性 第9章 模板 第10章 類庫和C+的標(biāo)準(zhǔn)模板庫STL 第11章 輸入輸出流 第12章 異常處理,第10章 類庫和C+的標(biāo)準(zhǔn)模板庫STL,10.1 類庫的概念 10.2 C+的標(biāo)準(zhǔn)模板庫STL,10.1 類庫的概念,1.1.1 什么是類庫(class library)? 1.1.2 如何分析、利用類庫? 1.1.3 類庫的特點(diǎn) 1.1.4 類庫是面向?qū)ο蟮能浖_發(fā)環(huán)境的核心,10.

2、1.1 什么是類庫?,類庫是類的集合,并且給出了多種類之間的關(guān)系描述。 為了便于程序員的開發(fā)工作,系統(tǒng)提供了一批可供重用的代碼。 (源程序代碼) 具體表現(xiàn)為一組類,通過建立彼此間的繼承關(guān)系形成類庫,以類的形式提供給用戶重用。,什么是類庫? ( 續(xù)),在設(shè)計(jì)和實(shí)現(xiàn)面向?qū)ο蟮某绦虻臅r(shí)候,要用類和類庫,才能得到所需的對(duì)象,即類的實(shí)例。 所以,類庫是一種預(yù)定義的面向?qū)ο蟮某绦驇臁?類庫的例子,C+ Standard STL library Microsoft Visual C+系統(tǒng)中提供的MFC類庫。 MFC Microsoft Foundation Class Borland C+系統(tǒng)中提供的OWL

3、類庫。 C+ Builder 系統(tǒng)中提供的VCL類庫。,類庫為軟件重用提供基礎(chǔ),OOP提供的繼承機(jī)制使得程序員可以在已有類的基礎(chǔ)上定義自己需要的新類,從而實(shí)現(xiàn)了軟件模塊的重用。,程序員分工進(jìn)一步細(xì)化,在面向?qū)ο蟮某绦蛟O(shè)計(jì)范型之下,程序員的隊(duì)伍可能要分為兩種,它們都以類作為工作對(duì)象 一個(gè)隊(duì)伍主要是設(shè)計(jì)類和類庫,另一個(gè)隊(duì)伍主要是使用類來設(shè)計(jì)應(yīng)用程序。 分工細(xì)化就意味著進(jìn)步,10.1.2 如何分析、利用類庫?,要想發(fā)揮面向?qū)ο蠓椒ǖ膬?yōu)勢,程序員必須知道類庫的組織情況。 我們可以通過聯(lián)機(jī)幫助或類庫參考手冊(cè)(類庫工作手冊(cè))了解: 軟件開發(fā)系統(tǒng)提供的類庫的類層次結(jié)構(gòu)。 可能需要用到的類及其父類的屬性和方法

4、。 通過聯(lián)機(jī)文檔提供的例子學(xué)習(xí)有關(guān)類的使用方法。,衡量應(yīng)用程序員能力的標(biāo)準(zhǔn)的變化,結(jié)構(gòu)化程序設(shè)計(jì)時(shí)代的標(biāo)準(zhǔn):每天編寫的源代碼行數(shù),程序結(jié)構(gòu)清晰。 面向?qū)ο蟪绦蛟O(shè)計(jì)時(shí)代的標(biāo)準(zhǔn): 衡量一個(gè)應(yīng)用程序員的生產(chǎn)力,要看他是否知道如何來最好地發(fā)揮已有類庫的功能, 要看他有沒有能力將已有的類庫與新問題緊密的匹配起來, 還要看他不得不另外編寫的代碼是不是最少。,10.1.3 類庫有什么特點(diǎn),通用性 可擴(kuò)充性 概念性與層次性 靈活性,通用性,基于重用的目的,選擇具有廣泛適用性的東西作為類庫的內(nèi)容,并經(jīng)過全面的考慮,使之適用于較多的情況。,可擴(kuò)充性,在軟件開發(fā)過程中,可以添加新的類供以后使用。 對(duì)已有的類庫進(jìn)行改

5、進(jìn)時(shí),只要保持接口不變,修改不會(huì)引起外部(即應(yīng)用系統(tǒng))軟件的變化。,概念性與層次性,類庫中的每個(gè)類的概念要明確,易于理解,將具有某些共同性質(zhì)的類作為基類。 設(shè)計(jì)類要有一個(gè)明確的目標(biāo)。 一個(gè)好的類應(yīng)該是容易理解和使用的。,10.1.4 類庫是面向?qū)ο蟮能浖_發(fā)環(huán)境的核心,OOP開發(fā)方法只有基于軟件重用的思想,才能真正提高軟件開發(fā)的效率和質(zhì)量。 類庫為軟件重用提供了基礎(chǔ),程序設(shè)計(jì)不必再從零開始。 類庫不同于傳統(tǒng)的子程序庫(函數(shù)庫),它的性能大大優(yōu)于子程序庫。,10.2 C+的標(biāo)準(zhǔn)模板庫STL,10.2.1 名字空間namespace簡介 10.2.2 C+標(biāo)準(zhǔn)庫的構(gòu)成 10.2.3 標(biāo)準(zhǔn)模板庫ST

6、L簡介 10.2.4 標(biāo)準(zhǔn)模板庫STL應(yīng)用舉例,10.2.1 名字空間namespace簡介,日常生活中人名相同引起的名字沖突; C+程序中出現(xiàn)相同的名字引起的沖突: 容器類庫中有一個(gè)List類 窗口類庫中有一個(gè)List類 如果一個(gè)程序中要同時(shí)使用這兩個(gè)類庫就會(huì)發(fā)生名字沖突,名字沖突的危害,在同一個(gè)源文件(編譯單元)中出現(xiàn)的名字沖突可以由編譯器 compiler 檢查出來: Redefined Symbols ( ambiguous symbol ) 在不同編譯單元(如目標(biāo)文件)之間的名字沖突可能由鏈接器Linker檢查出來: Identifier multiply defined 也可能導(dǎo)致

7、錯(cuò)誤鏈接,從而產(chǎn)生運(yùn)行時(shí)錯(cuò)誤 runtime error。,名字沖突的原因,C+中采用的是單一的全局名字空間(參見)。在這單一的空間中,如果有兩個(gè)類、兩個(gè)變量或兩個(gè)函數(shù)的名字完全相同,就會(huì)出現(xiàn)名字沖突。,作用域的概念 scope,局部作用域 local scopes : 塊作用域 函數(shù)作用域 文件作用域 全局作用域 global scopes 全局標(biāo)識(shí)符號(hào):全局變量名、全局函數(shù)名、全局類型名等等 全局名字在整個(gè)程序范圍內(nèi)有效,名字空間 namespace,使用名字空間來劃分全局名字空間可以避免名字沖突。 解決的辦法就是將程序中相同的名字定義在兩個(gè)不同的名字空間中。,名字空間 namespace

8、 (續(xù)),名字空間就是為解決C+中的變量、函數(shù)等的名字沖突而服務(wù)的。 程序規(guī)模越大,名字空間就越有用。 The larger a program is, the more useful namespaces are to express logical separations of its parts. namespace又譯作 :命名空間、名稱空間,名字空間的例子,/兩個(gè)在不同命名空間中定義的名字相同的變量 namespace myown1 string user_name = myown1; namespace myown2 string user_name = myown2; ,名字空間

9、的名字,int main() cout n Hello, myown1:user_name . and goodbye!n; cout n Hello, myown2:user_name . and goodbye!n; return 0; ,用命名空間限制符myown1訪問變量user_name,用命名空間限制符myown2訪問變量user_name,int main( ) using namespace myown1; cout n Hello, user_name . and goodbye!n; /using namespace myown2; cout n Hello, myown2

10、:user_name . and goodbye!n; return 0; ,用命名空間限制符myown2訪問變量user_name,無需用命名空間限制符myown1訪問變量user_name,創(chuàng)建名字空間,namespace namespacename / / declaration and definitions ,可見,創(chuàng)建名字空間與定義一個(gè)類很相似,實(shí)際上類名就是一個(gè)名字空間的名字。,using namespace,關(guān)鍵字 using 將一個(gè)名字空間變?yōu)榭梢?,?shí)際上只是將該名字空間的名字添加到當(dāng)前名字空間中。 命令using的作用域從其聲明之處開始并持續(xù)到當(dāng)前作用域scope結(jié)束。 在

11、使用一個(gè)名字空間時(shí),并不會(huì)覆蓋當(dāng)前的名字空間。,using namespace 的有效范圍,int main( ) using namespace myown1; cout n Hello, user_name . and goodbye!n; using namespace myown2; cout n Hello, user_name . and goodbye!n; return 0; ,名字空間小結(jié),一、名字空間解決了C+的名字沖突問題 二、注意名字空間namespace的書寫格式,和類class相似或相同。 三、名字空間名必需是唯一的,否則必需在它們的外面再套上一層名字空間,亦即名字

12、空間可以和類一樣的嵌套使用 四、同名類在聲明實(shí)例時(shí)必需加上名字空間作用域符“名字空間名:類名” 五、不一定只有類才可加上名字空間的外套,其它如,局部變量、函數(shù)等都可加上名字空間外套。,10.2.2 C+標(biāo)準(zhǔn)庫的構(gòu)成,基本的運(yùn)行庫 例如支持動(dòng)態(tài)內(nèi)存分配、運(yùn)行時(shí)類型信息RTTI C語言的標(biāo)準(zhǔn)庫 標(biāo)準(zhǔn)模板庫(STL) 輸入輸出流類庫( I/O Stream)和字符串 數(shù)值計(jì)算庫 例如支持復(fù)數(shù)的計(jì)算,C+標(biāo)準(zhǔn)庫名字空間,#include using namespace std; int main( ) std: :cout Hello, world!n; ,C+的標(biāo)準(zhǔn)庫定義在 名字空間 std之中.,

13、標(biāo)準(zhǔn)庫定義在名字空間std,#include #include using namespace std; /該編譯指示引入std 里的所有符號(hào) /使用該編譯指示using namespace std;在C+標(biāo)準(zhǔn)類庫中定義的名字在本程序中可以使用 /否則,iostream,string 等c+標(biāo)準(zhǔn)類就不可見了,編譯就會(huì)出錯(cuò)。,10.2.3 標(biāo)準(zhǔn)模板庫STL簡介,Standard Template Library ( STL) 包含常用算法和數(shù)據(jù)結(jié)構(gòu)的通用庫 STL的核心內(nèi)容是3個(gè)基本組件: 容器 算法 迭代器,STL中的容器類,容器(container)類是用來保存其它對(duì)象的,STL中定義了多種

14、不同類型的容器,例如: 向量 vector 線性表 list 隊(duì)列 queue 映射 map 集合 set 字符串string (還有其他容器類,可以參考其他書籍或者查閱聯(lián)機(jī)手冊(cè)),常用算法,排序 sort( ) 查找 find( ) 替換 replace( ) 合并 merge( ) 反序 reverse( ) 統(tǒng)計(jì) count( ) 其他等等算法,迭代器(iterator),迭代器是一種類似于指針的對(duì)象??梢允褂玫鱽碓L問容器中的元素,就像我們使用指針來訪問數(shù)組一樣。 STL中定義了五種迭代器: 隨機(jī)訪問迭代器 RandIter 雙向迭代器 BiIter 前向迭代器 ForIter 輸入

15、迭代器 InIter 輸出迭代器 OutIter,STL的簡單使用方法,在實(shí)際的C+面向?qū)ο蟪绦蛟O(shè)計(jì)中,STL庫將起著舉足輕重的作用。 STL是一個(gè)非常龐大、復(fù)雜的類庫 目前已經(jīng)有不少專著介紹STL 我們通過簡單的實(shí)例介紹最基本的應(yīng)用方法,10.2.4 標(biāo)準(zhǔn)模板庫STL應(yīng)用舉例,向量 vector 線性表 list 隊(duì)列 queue 映射 map 字符串string,1. 向量 vector,向量vector類可用來支持動(dòng)態(tài)數(shù)組,動(dòng)態(tài)數(shù)組是指可以根據(jù)需要改變大小的數(shù)組。 可以很容易地聲明一個(gè)vector類對(duì)象,例如: vector iv; vector cv(5); vector cv(5,x

16、); vector iv2(iv);,vector應(yīng)用實(shí)例,/ Access a vector using an iterator. #include #include using namespace std; int main( ) vector v; / create zero-length vector int i; / put values into a vector for(i=0; i10; i+) v.push_back(A + i);,vector應(yīng)用實(shí)例(續(xù)),/ can access vector contents using subscripting for(i=0; i

17、:iterator p = v.begin( ); while(p != v.end() cout *p ; p+; return 0; ,2. 線性表 list,線性表 list 類定義了雙向的線性表, 又可稱為雙向鏈表。List類只支持順序訪問。 下面的C+程序通過實(shí)例化鏈表list類模板建立了一個(gè)保存字符的鏈表,接著使用類模板的排序方法sort( )進(jìn)行排序,然后輸出經(jīng)過排序后的字符。,線性表list應(yīng)用實(shí)例(續(xù)),/ Sort a list. #include #include #include using namespace std; int main() int i; list l

18、st; / create a list of random characters for(i=0; i10; i+) lst.push_back(A+ (rand()%26);,線性表list應(yīng)用實(shí)例(續(xù)),cout :iterator p = lst.begin(); while(p != lst.end() cout *p; p+; cout endl endl; / sort the list lst.sort( );,線性表list應(yīng)用實(shí)例(續(xù)),cout Sorted contents: ; p = lst.begin(); while(p != lst.end() cout *p;

19、 p+; return 0; ,3. 隊(duì)列 queue,隊(duì)列(queue)是一個(gè)先進(jìn)先出(FIFO: First In First Out)的數(shù)據(jù)結(jié)構(gòu),在程序設(shè)計(jì)中經(jīng)常使用。 對(duì)一個(gè)隊(duì)列常用的操作有,在隊(duì)列尾增加一個(gè)元素、在隊(duì)列頭取一個(gè)元素以及測試隊(duì)列是否為空、是否為滿等操作。,隊(duì)列queue的應(yīng)用實(shí)例,Using queue class in the Standard C+ Library, Instantiate a queue for strings and demonstrate the following functions in main( ) to show that you k

20、now how to use this class: queue:push( ) queue:pop( ) queue:empty( ) queue:front( ) queue:back( ) queue:size( ),#include #include #include using namespace std; void main( ) queue str_queue; str_queue.push(string1); str_queue.push(string2); str_queue.push(string3);,coutthe size of the queue is: str_q

21、ueue.size()endl; coutthe front one str_queue.front()endl; coutthe back one str_queue.back()endl; str_queue.pop( ); str_queue.pop( ); str_queue.pop( ); if (str_queue.empty( ) cout the queue is empty!endl; ,4. 映射 map,映射map類定義了一個(gè)關(guān)聯(lián)容器,并且在容器中使用唯一的關(guān)鍵字來映射相應(yīng)的值。 map類對(duì)象是一系列關(guān)鍵字值的匹配對(duì)。 map的功能在于:只要知道了一個(gè)值的關(guān)鍵字,就可以找

22、到這個(gè)值。 下面的實(shí)例程序通過實(shí)例化標(biāo)準(zhǔn)庫中的map類模板映射建立了一些英文單詞與其反義詞的對(duì)應(yīng)關(guān)系,利用這種對(duì)應(yīng)系可以迅速查找到一個(gè)詞的反義詞。,映射map類應(yīng)用實(shí)例,/ A map of word opposites, using strings. #include #include #include using namespace std; int main( ) int i; map m; m.insert(pair(yes, no); m.insert(pair(up, down); m.insert(pair(left, right); m.insert(pair(good, ba

23、d);,映射map類應(yīng)用實(shí)例(續(xù)),string s; cout s; map:iterator p; p = m.find(s); if(p != m.end() cout second; else cout Word not in map.n; return 0; ,5. 字符串類 string,C+提供了兩種處理字符串的方法: 以空字符0結(jié)尾的字符數(shù)組 容器類string類的對(duì)象(標(biāo)準(zhǔn)庫中的string類) 使用標(biāo)準(zhǔn)庫中的string類的三個(gè)理由: 一致性(字符串定義為一種數(shù)據(jù)類型) 方便性(可以使用標(biāo)準(zhǔn)的運(yùn)算符) 安全性(不會(huì)出現(xiàn)數(shù)組越界錯(cuò)誤),字符串類 string應(yīng)用實(shí)例,/ De

24、monstrate insert(), erase(), and replace(). #include #include using namespace std; int main() string str1(This is a test); string str2(ABCDEFG); cout Initial strings:n; cout str1: str1 endl; cout str2: str2 nn;,字符串類 string應(yīng)用實(shí)例(續(xù)),/ demonstrate insert() cout Insert str2 into str1:n; str1.insert(5, str2); cout str1 nn; / demonstrate erase() cout Remove 7 characters from str1:n; str1.erase(5, 7); cout str1 nn;,字符串類 string應(yīng)用實(shí)例(續(xù)),/ demonstrate replace co

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論