培訓(xùn)體系++中級(jí)培訓(xùn)教材_第1頁(yè)
培訓(xùn)體系++中級(jí)培訓(xùn)教材_第2頁(yè)
培訓(xùn)體系++中級(jí)培訓(xùn)教材_第3頁(yè)
培訓(xùn)體系++中級(jí)培訓(xùn)教材_第4頁(yè)
培訓(xùn)體系++中級(jí)培訓(xùn)教材_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

培訓(xùn)體系++中級(jí)培訓(xùn)教材附件三:教材模板說明:一、為便于保存和管理,各類培訓(xùn)教材均采用合訂本。二、教材結(jié)構(gòu):各類培訓(xùn)教材由教材封面、前言、課程目錄、單門課程教材和封底五部分構(gòu)成。感謝閱讀三、教材封面:1、封面顏色:教材封面為彩色,工作基本常識(shí)教材為深藍(lán)色,技術(shù)基礎(chǔ)知識(shí)教材精品文檔放心下載為草綠色,管理基礎(chǔ)知識(shí)教材為淺藍(lán)色,營(yíng)銷基礎(chǔ)知識(shí)教材為墨綠色。謝謝閱讀2、教材名稱:采用“工作基本常識(shí)”“技術(shù)基礎(chǔ)知識(shí)”“管理基礎(chǔ)知識(shí)”“營(yíng)銷精品文檔放心下載基礎(chǔ)知識(shí)”,字體為隸書,黑體,60號(hào)。3、其他標(biāo)識(shí):?jiǎn)T工培訓(xùn)中心編輯采用宋體、黑體、三號(hào),位于教材名稱下面;華謝謝閱讀精品文檔放心下載司和員工培訓(xùn)中心編輯之間;右上角為保密標(biāo)識(shí),楷體,黑體,四號(hào)。感謝閱讀四、教材封底:謝謝閱讀面的右下角。五、前言:教材前言為各類培訓(xùn)的目的、課程門類、特點(diǎn)、主要內(nèi)容的簡(jiǎn)介。謝謝閱讀六、課程目錄:為各門課程排列順序的目錄,統(tǒng)一編排頁(yè)碼,便于學(xué)員查找。謝謝閱讀七、單門課程教材:感謝閱讀和相關(guān)網(wǎng)站組成。1、課程封面:課程封面為彩色,課程名稱為隸書、60號(hào)、黑體、黑色,左上角為課程編碼。感謝閱讀2、章節(jié)目錄:為宋體、小四、黑色3、章節(jié)內(nèi)容:(1)標(biāo)題:章節(jié)目分別以“第一章、第二章、第三章”“1.1、1.2、1.3”和感謝閱讀“(1)(2)(3)”來表示。章為宋體、小二、黑體,節(jié)為宋體、四號(hào)、黑體,謝謝閱讀目為宋體、小四、黑體。(210000——20000字之間。教材文精品文檔放心下載字一般為宋體、小四、黑色,行間距為一行半。(3)內(nèi)容:章節(jié)內(nèi)容要有完整的理論體系,不能成為授課膠片的翻版。

4、學(xué)習(xí)要求:精品文檔放心下載每章標(biāo)題下面為本章的學(xué)習(xí)要求,以明確本章要掌握的要點(diǎn)。文字為楷體、小四。精品文檔放心下載5、思考題:每章最后要有思考題,以便幫助學(xué)員復(fù)習(xí)、思考。6、參考資料和相關(guān)網(wǎng)站:有參考資料和相關(guān)網(wǎng)站的要附在課程后面,以便幫助學(xué)員查閱。感謝閱讀內(nèi)部資料,注意保密C++中級(jí)培訓(xùn)教程員工培訓(xùn)中心編輯2005年6月V1.0華為技術(shù)有限公司前言C++語言中級(jí)教材講授C++語言的運(yùn)用技術(shù),包括:類、對(duì)象之間的關(guān)系、對(duì)象的存儲(chǔ)與布局、運(yùn)算符重載、智能指針、仿函數(shù)、泛型編程,C++模式設(shè)計(jì)基本精品文檔放心下載思想。華為技術(shù)NE002009cV1.01業(yè)務(wù)與軟件C++語言項(xiàng)目C++進(jìn)階目錄第一章類、接口…………………7謝謝閱讀1.1Handle-Body與接口、抽象接口…………7精品文檔放心下載1.2多繼承、與菱形缺陷、this跳轉(zhuǎn)等………13感謝閱讀1.3C++多態(tài)的兩種多態(tài)形式和區(qū)別……………18感謝閱讀第二章重載………………………18謝謝閱讀2.1函數(shù)重載………………………19謝謝閱讀2.2運(yùn)算符重載…………………20感謝閱讀第三章模板………………………29謝謝閱讀3.1模塊函數(shù)……………………29感謝閱讀3.2模塊類……………31謝謝閱讀3.3STL標(biāo)準(zhǔn)模板庫(kù)…………………34感謝閱讀附錄:參考資料………………………39感謝閱讀前言我們?cè)贑++基礎(chǔ)課程中已經(jīng)了解了C++精品文檔放心下載C++面向?qū)ο蟮幕咎卣鳎菊n程主要是更進(jìn)一步探討一下C++一些基本模型的謝謝閱讀應(yīng)用,加深對(duì)概念的理解,由于課程時(shí)間有限,C++,模型和內(nèi)容又如此之多,對(duì)任何一個(gè)模型都精品文檔放心下載無法深入進(jìn)去,所以只能泛泛而談。第一章類、接口學(xué)習(xí)要求:1、了解類的繼承、封裝等概念之間的關(guān)系2特點(diǎn)。學(xué)會(huì)使用接口編程的思想本章節(jié)主要介紹C++中的類、接口。類,包涵了一組數(shù)據(jù)和一組基于數(shù)據(jù)上的一精品文檔放心下載謝謝閱讀的行為。有關(guān)類的基本概念:ClassnamesClassmembersMemberFunctionsStaticMemberFunctionsUnionsC++BitFieldsNestedClassDeclarationsTypeNamesinClassScopeMultipleBaseClassesVirtualFunctionsAbstractClassesControllingAccesstoClassMembers感謝閱讀privateMembersprotectedMemberspublicMembersAccessSpecifiersforBaseClassespriavtepublic、精品文檔放心下載protectedFriendsConstructorsDestructorsConversionFunctionsthenewoperatorandthedeleteoperator謝謝閱讀CopyingConstructorFunctions謝謝閱讀Interface1.1Handle-Body與接口、抽象接口在C++精品文檔放心下載但是C++的封裝是不完全的,編譯器必須知道一個(gè)對(duì)象的所有部分的聲明,以便創(chuàng)建和感謝閱讀感謝閱讀實(shí)現(xiàn)部分隱藏起來。C++在編譯期間要盡可能多地做靜態(tài)類型檢查。這意味著盡早捕感謝閱讀獲錯(cuò)誤,也意味著程序具有更高的效率。然而這對(duì)私有的實(shí)現(xiàn)部分來說帶來兩個(gè)影響:精品文檔放心下載謝謝閱讀復(fù)編譯。然而C++C++的類既是描述了一精品文檔放心下載個(gè)接口同時(shí)也描述了實(shí)現(xiàn)的過程,示例如下:classCMyString{private:constintm_cch;char*m_psz;public:CMyString(constchar*psz);感謝閱讀~CMyString();intLength()const;intIndex(constchar*psz)const;感謝閱讀}CMyStirng對(duì)外過多的暴露了內(nèi)存布局實(shí)現(xiàn)的細(xì)節(jié),這些信息過度的依賴于這些成員變感謝閱讀精品文檔放心下載的接口不利于跨語言跨平臺(tái)的軟件開發(fā)和移植。1.1.1Handle-Body模式handleclasses叫“Cheshire謝謝閱讀1]。有關(guān)實(shí)現(xiàn)的任何東西都消失了,只剩一個(gè)單一的指針“m_pThis”。該指針指向一謝謝閱讀謝謝閱讀精品文檔放心下載實(shí)現(xiàn)文件進(jìn)行重新編譯,然后再連接到項(xiàng)目中。感謝閱讀指定的類指針。classCMyStringHandle{private:classCMyString;CMyString*m_pThis;public:CMyStringHandle(constchar*psz);感謝閱讀~CMyStringHandle();intLength()const;intIndex(constchar*psz)const;感謝閱讀};CMyStringHandle::CMyStringHandle(constchar*psz)感謝閱讀:m_pThis(newCMyString(psz));精品文檔放心下載{}CMyStringHandle::~CMyStringHandle()謝謝閱讀{deletem_pThis;}intCMyStringHandle::Length()感謝閱讀{returnm_pThis->Length();}intCMyStringHandle::Index(constchar*psz)感謝閱讀{returnm_pThis->Index(psz);精品文檔放心下載}這是所有客戶程序員都能看到的。這行classCMyString;精品文檔放心下載器,cheshire是一個(gè)結(jié)構(gòu)的名字,但沒有提供有關(guān)該結(jié)構(gòu)的任何東西。這對(duì)產(chǎn)生一個(gè)感謝閱讀謝謝閱讀對(duì)象。在這種技術(shù)里,包含具體實(shí)現(xiàn)的結(jié)構(gòu)主體被隱藏在實(shí)現(xiàn)文件中。感謝閱讀Handle-Body模式,Handle-Body只含有一個(gè)實(shí)體指針,精品文檔放心下載服務(wù)的數(shù)據(jù)成員永遠(yuǎn)被封閉在服務(wù)系統(tǒng)中。Handle-Body模式如下:classHandlem_pThisclass圖1Handle-Body模式(句柄類做為接口)Handle-Body的布局結(jié)構(gòu)永遠(yuǎn)不會(huì)隨著實(shí)現(xiàn)類數(shù)據(jù)成員的加入或者刪除或者修改而導(dǎo)致感謝閱讀Handle-Body的修改,即Handle-Body協(xié)議不依賴于C++實(shí)現(xiàn)類的任何細(xì)節(jié)。這就有效的感謝閱讀對(duì)用戶的編譯器隱藏了這些斜街,用戶在使用對(duì)這項(xiàng)技術(shù)時(shí)候,Handle-Body接口成謝謝閱讀了它唯一的入口。然而Handle-Body模式也有自己的弱點(diǎn):1、精品文檔放心下載造和一個(gè)析構(gòu)的類來說顯然不構(gòu)成負(fù)擔(dān),但是如果一個(gè)龐大的類庫(kù),它有上感謝閱讀百上千個(gè)方法時(shí)候,光是編寫這些方法傳遞就有可能非常冗長(zhǎng),這也增加了精品文檔放心下載出錯(cuò)的可能性。2、感謝閱讀不理想3、由于句柄的存在依然存在編譯連接器兼容性問題。接口和實(shí)現(xiàn)分離的Handle-Body。1.1.2抽象接口技術(shù)的Handle-Body解決了編譯器/鏈接器的大部精品文檔放心下載分問題,而C++面向?qū)ο缶幊讨械某橄蠼涌谕瑯邮沁\(yùn)用了“接口與實(shí)現(xiàn)分離”的思想,精品文檔放心下載而采用抽象接口對(duì)于解決這類問題是一個(gè)極其完美的解決方案。謝謝閱讀1、抽象接口的語言描述:classIMyString{virtualintLength()const=0;//這表示是一個(gè)純虛函數(shù),具有純感謝閱讀虛函數(shù)的接口virtualintIndex(constchar*psz)const=0;謝謝閱讀};2、抽象接口的內(nèi)存結(jié)構(gòu):圖2抽象接口的內(nèi)存布局3、抽象接口的實(shí)現(xiàn)代碼:接口:classIMyString{virtualintLength()const=0;//這表示是一個(gè)純虛函數(shù),感謝閱讀具有純虛//函數(shù)的接口virtualintIndex(constchar*psz)const=0;精品文檔放心下載};實(shí)現(xiàn):classCMyString:publicIMyString精品文檔放心下載{private:constintm_cch;char*m_psz;public:CMyString(constchar*psz);感謝閱讀virtual~CMyString();intLength()const;intIndex(constchar*psz)const;謝謝閱讀}從上面采用抽象接口的實(shí)例來看,抽象接口解決了Handle-Body所遺留下來的全精品文檔放心下載部缺陷。抽象接口的一個(gè)典型應(yīng)用:抽象工廠(AbstractFactroy)圖3抽象工廠模式1.2多繼承與菱形缺陷、this跳轉(zhuǎn)等多重繼承是C++語言獨(dú)有的繼承方式,其它幾乎所有語言都秉承了單一繼承的思精品文檔放心下載想。這是因?yàn)槎嘀乩^承致命的缺陷導(dǎo)致的:1.2.1菱形缺陷B從A1和感謝閱讀A2兩個(gè)類多重繼承而來,這樣B類就包含A1、A2類的數(shù)據(jù)成員副本。謝謝閱讀考慮如果A1、A2都從某基類派生,該基類稱為Base,現(xiàn)在繼承關(guān)系如下:感謝閱讀圖4菱形繼承關(guān)系我們C++語言來描述這種繼承關(guān)系:classBase{……};classA1:publicBase{……};精品文檔放心下載classA2:publicBase{……};精品文檔放心下載classB:publicA1,publicA2{……};精品文檔放心下載那么A1、A2都具有Base的副本。這樣B就包含了Base的兩個(gè)副本,副本發(fā)生了重精品文檔放心下載疊,不但增加了存儲(chǔ)空間,同時(shí)也引入了二義性。這就是菱形缺陷,菱形缺陷時(shí)感謝閱讀間是兩個(gè)缺陷:1、子對(duì)象重疊2、向上映射的二義性。菱形缺陷的其中一種解決辦法將在C++世界里最廣泛的使用虛擬繼承解決菱形缺陷的應(yīng)用便是標(biāo)準(zhǔn)C++的輸入/輸謝謝閱讀出iostream;圖5標(biāo)準(zhǔn)C++的輸入/輸出1.2.2多重接口與方法名沖突問題(Siamesetwins)精品文檔放心下載精品文檔放心下載原型”的虛函數(shù)情況就不那么容易了。提出問題:假設(shè)汽車最大速度的接口為ICarIBoat謝謝閱讀ICarIBoat精品文檔放心下載兩種交通工具的最大速度特性,我們定義它的接口為ICarBoat;精品文檔放心下載classICar{virtualintGetMaxSpeed()=0;精品文檔放心下載};classIBoat{virtualintGetMaxSpeed()=0;感謝閱讀};我們先對(duì)ICarBoat的接口做一個(gè)嘗試:classCCarBoat{virtualintGetMaxSpeed(//既完成ICar的GetMaxSpeed()接口方精品文檔放心下載法又//完成IBoat的接口方法?顯然不能夠};解決問題:顯然上面這個(gè)嘗試根本就無法成功,只用一個(gè)實(shí)現(xiàn)方法,怎么能夠求出這個(gè)精品文檔放心下載ICarBoat精品文檔放心下載速度呢。ICarBoat要返回兩個(gè)感謝閱讀答案就必須有兩個(gè)方法了,我們假設(shè)一個(gè)方法是求在陸地上奔跑的速度,名稱為謝謝閱讀GetCarMaxSpeed();另一個(gè)方法是求在大海上航行的最大速度,名稱為精品文檔放心下載GetBoatMaxSpeed();那這兩個(gè)方法又怎么和GetMaxSpeed()接口方法聯(lián)系起來呢;謝謝閱讀精品文檔放心下載classIXCar:publicICar{virtualintGetMaxSpeed(){GetCarMaxSpeed();}virtualintGetCarMaxSpeed()=0;感謝閱讀};classIXBoat:publicIBoat{virtualintGetMaxSpeed(){GetBoatMaxSpeed();}virtualintGetBoatMaxSpeed()=0;感謝閱讀};classCCarBoat:publicIXCar,publicIXBoat謝謝閱讀{virtualintGetCarMaxSpeed()謝謝閱讀{……}virtualintGetBoatMaxSpeed()感謝閱讀{……}};圖6多重接口與方法名沖突問題1.2.3this跳轉(zhuǎn)this跳轉(zhuǎn)是指的“對(duì)象同一性”問題。精品文檔放心下載或者父類的this指針永遠(yuǎn)相等。即如果有下面的模型:感謝閱讀圖7B從A繼承的關(guān)系圖那么對(duì)于一個(gè)已經(jīng)實(shí)例化B類的對(duì)象bObject,永遠(yuǎn)有(B*)&bObject精品文檔放心下載==(A*)&bObject成立。但是在多繼承的世界內(nèi),上面的等式就不能恒成立,對(duì)象的同一性受到了挑戰(zhàn)。感謝閱讀圖四感謝閱讀化B類的對(duì)象bObject;(Base*)(A1*)&bObject!=(Base*)(A2*)&bObject成謝謝閱讀立,當(dāng)這種事情發(fā)生的時(shí)候我們就只能特殊處理了。這種情況在COM應(yīng)用中處處都會(huì)發(fā)感謝閱讀生。1.3C++多態(tài)的兩種多態(tài)形式和區(qū)別C++有兩種多態(tài)多態(tài)形式:1、編譯時(shí)刻多態(tài),編譯時(shí)刻多態(tài)依靠函數(shù)重載或者模板實(shí)現(xiàn)謝謝閱讀2、運(yùn)行時(shí)刻多態(tài)。運(yùn)行時(shí)刻多態(tài)依靠需函數(shù)虛接口實(shí)現(xiàn)精品文檔放心下載第二章重載學(xué)習(xí)要求:1、了解什么是函數(shù)重載,什么是運(yùn)算符重載2、學(xué)會(huì)運(yùn)用智能指針,仿函數(shù)在C++精品文檔放心下載精品文檔放心下載新定義C++的內(nèi)嵌運(yùn)算符的方法。有關(guān)重載的基本概念:OverloadedFunctionsOverloadedOperatorsDeclarationMatchingArgumentMatchingArgumentTypesMatchingArgumentCountsMatchingC++UnaryOperatorsBinaryOperatorsSmartPointerFunctionobjects1.1函數(shù)重載函數(shù)重載方法是在當(dāng)前范圍內(nèi)選擇一個(gè)最佳匹配的函數(shù)聲明供調(diào)用該方法者使精品文檔放心下載適合是指按下謝謝閱讀列順序匹配的符合下面條件的:1、一個(gè)精確匹配的函數(shù)被找到2、一個(gè)參數(shù)只有細(xì)微的差別,幾乎可以忽略不計(jì)的。3、象類似通過子類向父類轉(zhuǎn)化達(dá)到參數(shù)匹配的4、通過正常轉(zhuǎn)化函數(shù)進(jìn)行類型轉(zhuǎn)換,能夠達(dá)到參數(shù)匹配到的。感謝閱讀5、通過用戶自定義的轉(zhuǎn)化函數(shù)(如轉(zhuǎn)化運(yùn)算符或者構(gòu)造函數(shù))達(dá)到參數(shù)匹配的精品文檔放心下載6、參數(shù)是采用省略符號(hào)函數(shù)重載的方法基本上有:1、根據(jù)函數(shù)參數(shù)數(shù)據(jù)類型的不同進(jìn)行的重載;2、根據(jù)參數(shù)個(gè)數(shù)的不同進(jìn)行的重載;3、缺省參數(shù)上的重載精品文檔放心下載在使用缺省參數(shù)時(shí)必須記住兩條規(guī)則。第一,只有參數(shù)列表的后部參數(shù)才可是缺省的,謝謝閱讀感謝閱讀謝謝閱讀放在函數(shù)聲明中。第四,缺省參數(shù)可以讓聲明的參數(shù)沒有標(biāo)識(shí)符。精品文檔放心下載4、返回值重載特別注意,在C++中并沒有根據(jù)返回返回值的不同進(jìn)行重載的,即我們不感謝閱讀能定義這樣的函數(shù):voidf();intf();在C++中這樣的函數(shù)聲明方法是被禁止的,但是我們有時(shí)間可能又需要這樣的重精品文檔放心下載載方法,我們又怎么實(shí)現(xiàn)呢,其實(shí)很簡(jiǎn)單,jiang函數(shù)的參數(shù)進(jìn)行擴(kuò)展,將這個(gè)函數(shù)返精品文檔放心下載回值的數(shù)據(jù)類型,做為擴(kuò)展參數(shù)的數(shù)據(jù)類型來。如下:voidf(void);voidf(int);感謝閱讀時(shí)刻并不起到傳值作用,模板中經(jīng)常都應(yīng)用到了這種方法。感謝閱讀1.2運(yùn)算符重載你可以重新定義C++絕大多數(shù)內(nèi)嵌運(yùn)算符的實(shí)現(xiàn)方法和功能,這些重定義的或者感謝閱讀謝謝閱讀現(xiàn)可能以類的成員函數(shù)的形式出現(xiàn),也有可能以全局性的函數(shù)的身份出現(xiàn)。謝謝閱讀在C++中重載運(yùn)算符的名字為operatorx,在這里x精品文檔放心下載重載operator+精品文檔放心下載定義就可以了,例如:Classcomplex//verysimplifiedcomplex謝謝閱讀{doublere,im;public:complex(doubler,doublei):re(r),im(i){};謝謝閱讀complexoperator+(complex);精品文檔放心下載complexoperator*(complex);精品文檔放心下載};定義了complex這個(gè)復(fù)數(shù)的一個(gè)簡(jiǎn)單的實(shí)現(xiàn)概念模型。一個(gè)復(fù)數(shù)是由一對(duì)謝謝閱讀double類型的數(shù)據(jù)組成,并定義了這個(gè)復(fù)數(shù)的兩個(gè)方法,加法運(yùn)算感謝閱讀complex::operartor+()和乘法運(yùn)算complex::operator*().現(xiàn)在我們就能夠?qū)崿F(xiàn)謝謝閱讀下面的復(fù)數(shù)表達(dá)式了:voidf(){complexa=complex(1,3.1);謝謝閱讀complexb=complex(1.2,2);感謝閱讀complexc=b;a=b+c;b=b+c*a;c=a*b+complex(1,2);感謝閱讀}1.3.1C++可重載的和C++不可重載的運(yùn)算符可重載運(yùn)算符表:OperatorNameTypeOperatorNameType精品文檔放心下載,CommaBinary–>*Pointer-to-memberBinary謝謝閱讀selection!LogicalNOTUnary/DivisionBinary精品文檔放心下載!=InequalityBinary/=Division/assignmentBinary精品文檔放心下載%ModulusBinary<LessthanBinary謝謝閱讀%=Modulus/assignmentBinary<<LeftshiftBinary精品文檔放心下載&BitwiseANDBinary<<=LeftBinary精品文檔放心下載shift/assignment&Address-ofUnary<=LessthanorequalBinary精品文檔放心下載to&&LogicalANDBinary=AssignmentBinary感謝閱讀&=BitwiseAND/assignBinary==EqualityBinary精品文檔放心下載()Functioncall—>GreaterthanBinary精品文檔放心下載*MultiplicationBinary>=GreaterthanorBinary謝謝閱讀equalto*PointerdereferenceUnary>>RightshiftBinary謝謝閱讀*=Multiplication/assigBinary>>=RightBinary感謝閱讀nshift/assignment+AdditionBinary[]Arraysubscript—謝謝閱讀+UnaryPlusUnary^ExclusiveORBinary謝謝閱讀++Increment1Unary^=ExclusiveBinary感謝閱讀OR/assignment+=Addition/assignmentBinary|BitwiseinclusiveBinary謝謝閱讀OR–SubtractionBinary|=BitwiseinclusiveBinary感謝閱讀OR/assignment–UnarynegationUnary||LogicalORBinary謝謝閱讀––Decrement1Unary~One’scomplementUnary感謝閱讀–=Subtraction/assignBinarydeletedelete—謝謝閱讀–>MemberselectionBinarynew精品文檔放心下載不可重載運(yùn)算符表:OperatorName.Memberselection.*Pointer-to-memberselection謝謝閱讀::Scoperesolution?:Conditional#Preprocessorsymbol##Preprocessorsymbol在上面可重載的運(yùn)算符可以看出運(yùn)算符重載共分為兩類:一元運(yùn)算符重載和二元運(yùn)算感謝閱讀符重載一元運(yùn)算符重載:在聲明一個(gè)類的非靜態(tài)的一元運(yùn)算符重載函數(shù)時(shí),你必須聲明的形式如感謝閱讀下:ret-typeoperatorop()(1)在這里ret-type是指返回?cái)?shù)據(jù)類型op是指一元運(yùn)算符謝謝閱讀在聲明一個(gè)全局的一元運(yùn)算符重載函數(shù)時(shí),你必須聲明的形式日下:精品文檔放心下載ret-typeoperatorop(arg)(2)精品文檔放心下載在這里ret-type與op和上面的意思一樣,arg是指這個(gè)運(yùn)算符所作謝謝閱讀用的數(shù)據(jù)類型二元運(yùn)算符重載:在聲明一個(gè)類的非靜態(tài)的二元運(yùn)算符重載函數(shù)時(shí),你必須聲明的形式如謝謝閱讀下:ret-typeoperatorop(arg)(3)精品文檔放心下載(3)式和二式基本相同arg可以是任何一個(gè)在聲明一個(gè)全局的二元運(yùn)算符重載函數(shù)時(shí),你必須聲明的形式日下:謝謝閱讀ret-typeoperatorop(arg1,arg2)(4)精品文檔放心下載在這里ret-type與op和上面的意思一樣,arg1,arg2,是指這個(gè)運(yùn)精品文檔放心下載算符所作用兩個(gè)數(shù)據(jù)類型1.3.2幾類特殊的運(yùn)算符重載1、類型轉(zhuǎn)換運(yùn)算符精品文檔放心下載定義的數(shù)據(jù)類型,如:classCString{……operatorLPCSTR()const;……};應(yīng)用:CStringstr=“12345”;LPCSTRlpsz=str;//此處會(huì)進(jìn)行LPCSTR運(yùn)算謝謝閱讀感謝閱讀曾經(jīng)就是用類型裝換運(yùn)算符重載解決一個(gè)跨平臺(tái)通信的問題。謝謝閱讀2、bool運(yùn)算符重載intfloatboolbool謝謝閱讀重載運(yùn)算符bool時(shí)候,需要注意有很多麻煩和臆想不到的東西精品文檔放心下載template<classT>classtestbool{……operatorbool()constthrow()謝謝閱讀{returnm_pT!=0;}private:T*m_pT;}下面結(jié)果均通過編譯testbool<int>sp1;testbool<std::string>sp2;感謝閱讀if(sp1==sp2)if(sp1!=sp2)boolb=sp1intI=sp1*10;從上面可以看得出bool的表現(xiàn)已經(jīng)遠(yuǎn)遠(yuǎn)超過bool本身了,所以建議大家不謝謝閱讀要輕易對(duì)bool進(jìn)行重載操作。3、地址運(yùn)算符重載在DCOM應(yīng)用中,我們有一個(gè)重載運(yùn)算符的例子:STDAPICoCreateInstance(REFCLSIDrclsid,LPUNKNOWNpUnkOuter,DWORDdwClsContext,REFIIDriid,LPVOID*ppv);我們看最后一個(gè)參數(shù)LPVOID指針的指針,這里是一個(gè)輸出參數(shù),返回感謝閱讀一個(gè)接口的指針。一般情況下我們應(yīng)用如下IUnknown*pUn;CoCreateInstance(…,…,…,…,(void**)&pUn);(5)精品文檔放心下載然而我們也可以這樣寫:IUnknown*pUn;CComPtrcomPtr(pUn);CoCreateInstance(…,…,…,…,(void**)&comPtr);(6)感謝閱讀之所以能夠這么寫這是因?yàn)镃ComPtr重載了“&”運(yùn)算符,如下:謝謝閱讀template<classT>classCComPtr{public:…CComPtr(T*lp){if((p=lp)!=NULL)p->AddRef();}…T**operator&(){ATLASSERT(p==NULL);return&p;}private:T*p;};&comPtr實(shí)際上是得到了pUn(5)式和(6式其實(shí)傳入的感謝閱讀參數(shù)是一樣當(dāng)都是傳入了pUn的地址。感謝閱讀作,這是因?yàn)椋篈、暴露了封裝對(duì)象的地址,如上面CComPtr對(duì)pUn的封裝其實(shí)不謝謝閱讀起任何作用,任何時(shí)候我都可以直接訪問和修改pUn指針,這就意味著感謝閱讀所有權(quán)的完全喪失,封裝不起任何意義B、對(duì)于unaryoperator&的重載使得重載對(duì)方永遠(yuǎn)無法與STL容器謝謝閱讀進(jìn)行任何融合,甚至無法參與任何泛型編程。一個(gè)對(duì)象的地址是一個(gè)對(duì)象最基本的概念,在一般情況下,我們并不提倡,精品文檔放心下載也請(qǐng)大家慎用地址運(yùn)算符的重載。4、指針運(yùn)算符重載指針運(yùn)算符,有一個(gè)及其特殊且及其重要的機(jī)制:當(dāng)你對(duì)某個(gè)型別實(shí)施operator-〉而這個(gè)型別并非原生指針時(shí)候:精品文檔放心下載編譯器會(huì)從這個(gè)型別中找出用戶自定義的operator-精品文檔放心下載續(xù)對(duì)這個(gè)operator-〉返回的結(jié)果實(shí)施operator-〉直到找到一個(gè)原生指針。精品文檔放心下載這種機(jī)制導(dǎo)致了一個(gè)特有的技術(shù):(preandpostfunctioncalls),謝謝閱讀“前調(diào)用”及后調(diào)用技術(shù)。應(yīng)用如下:classCallDoSomething{public:voidDoCall(){TRACE("DoCall\n");}};template<classT>classCallInMutiThread{classLockProxy{public:LockProxy(T*pT):m_pT(pT){TRACE("Lock\n");}~LockProxy(){TRACE("UnLock\n");}T*operator->(){returnm_pT;}private:T*m_pT;};public:CallInMutiThread(T*pT):m_pT(pT){

}LockProxyoperator->(){returnLockProxy(m_pT);}private:T*m_pT;};上面CallDoSomething是函數(shù)調(diào)用,假設(shè)這個(gè)類原來是在單線程中運(yùn)行的,但精品文檔放心下載是現(xiàn)在已經(jīng)移植到了多環(huán)境中,所以我們就增加了CallInMutiThread對(duì)原始謝謝閱讀類進(jìn)行配接使之適應(yīng)與多線程環(huán)境,調(diào)用過程如下:CallDoSomethingDoSomthing;感謝閱讀CallInMutiThread<CallDoSomething>MutiThread(&DoSomthing);感謝閱讀MutiThread->DoCall();調(diào)用結(jié)果如下:LockDoCallUnLock從上面可以看出在調(diào)用CallDoSomething的成員函數(shù)DoCall之前調(diào)用精品文檔放心下載了Lock方法,在調(diào)用結(jié)束后有調(diào)用了UnLock。這就是所謂的“前調(diào)用”和“后感謝閱讀調(diào)用精品文檔放心下載調(diào)用”模式均可由此解。重載“-〉”運(yùn)算符,同時(shí)引出了智能指針的概念,參見下頁(yè)。謝謝閱讀5、括號(hào)運(yùn)算符重載語法特征:primary-expression(expression-listopt)精品文檔放心下載括號(hào)運(yùn)算符是一個(gè)同“-〉”運(yùn)算符一樣也是一個(gè)及其重要的運(yùn)算符謝謝閱讀在MSDN上說括號(hào)運(yùn)算符是一個(gè)二元運(yùn)算符,我覺得這個(gè)說法是完全錯(cuò)誤的,在感謝閱讀所有C++運(yùn)算符重載中,括號(hào)運(yùn)算符,應(yīng)該是唯一沒有規(guī)定參數(shù)元的個(gè)數(shù)的。它謝謝閱讀的參數(shù)可以從0個(gè)到N個(gè)。示例:classPoint{public:Point(){_x=_y=0;}Point&operator()(intdx,intdy)感謝閱讀{_x+=dx;_y+=dy;return*this;}感謝閱讀private:int_x,_y;};調(diào)用如下:Pointpt;pt(3,2);從上面可以看出,括號(hào)運(yùn)算符,調(diào)用形式如下:object(parameterlist);看起來和函數(shù)的形式是完全一樣的:function(parameterlist);所以根據(jù)這一特點(diǎn)我們稱之為仿函數(shù)。第三章模板學(xué)習(xí)要求:1、了解什么是模板2、學(xué)會(huì)運(yùn)用模板函數(shù),模版類和STLtemplatesC++中最感謝閱讀活躍的一項(xiàng)編程技術(shù),模版的第一個(gè)革命性的應(yīng)用就是StandardTemplateLibrary謝謝閱讀(簡(jiǎn)稱STL)。STL將templates技術(shù)廣泛應(yīng)用于STL容器和STL算法上,在這一領(lǐng)域精品文檔放心下載template技術(shù)發(fā)揮到了極致。本章介紹C++templates的基本概念和語言特性謝謝閱讀1.1認(rèn)識(shí)模板1、模板的基本語法是:template<[typelist][,[arglist]]>declaration謝謝閱讀這個(gè)template感謝閱讀函數(shù)),這個(gè)模板參數(shù)列表是用逗號(hào)分隔的類型列表(在這個(gè)表單忠使用class或者精品文檔放心下載是typename精品文檔放心下載據(jù)類型。declaration域必須是一個(gè)函數(shù)或者類的聲明。感謝閱讀1.4模板函數(shù)語法定義:template<comma-separated-list-of-parameters>謝謝閱讀function-name(parameterlist)精品文檔放心下載{}例如:template<typenameT>inlineTconst&max(Tconst&a,Tconst&b)謝謝閱讀{//ifa<bthenusebelseusea謝謝閱讀returna<b?b:a;}調(diào)用形式:1:通過調(diào)用的參數(shù)來識(shí)別模板的各參數(shù)類型MAX(4,4.2);//OK,buttypeoffirstargument謝謝閱讀definesreturntype2:明確指定參數(shù)的類型:MAX<int,float>(4,4.2);//OK精品文檔放心下載在我們的例子中這個(gè)參數(shù)列表是typenameT,其實(shí)在這里typename是可以用感謝閱讀class替換的,typename是在C++class是一個(gè)歷史性的概謝謝閱讀念,typename表達(dá)了一個(gè)比class更抽象意義上的概念。感謝閱讀有如下定義如:classtypenamedef{typedefintINT_TYPE;};如果這樣表達(dá)是正確的:template<classT>classtesttypename:publictypenamedef感謝閱讀{public:typenameT::INT_TYPE;INT_TYPEm_int;};但是如果把此處的typename換成class就會(huì)報(bào)錯(cuò)謝謝閱讀1.4.1重載模板函數(shù)(OverloadingFunctionTemplates)謝謝閱讀謝謝閱讀具有不同的函數(shù)定義,在調(diào)用的時(shí)候再由C++編譯器決定,那一個(gè)候選函數(shù)更有資格被謝謝閱讀匹配調(diào)用。下面這個(gè)簡(jiǎn)單的例子說明了重載模板函數(shù)的方法和過程://maximumoftwointvalues謝謝閱讀inlineintconst&max(intconst&a,intconst&b)感謝閱讀{}returna<b?b:a;//maximumoftwovaluesofanytype精品文檔放心下載template<typenameT>inlineTconst&max(Tconst&a,Tconst&b)精品文檔放心下載{returna<b?b:a;}//maximumofthreevaluesofanytype謝謝閱讀template<typenameT>inlineTconst&max(Tconst&a,Tconst&b,Tconst&c)感謝閱讀{returnmax(max(a,b),c);}intmain(){::max(7,42,68);//callsthetemplateforthreearguments精品文檔放心下載::max(7.0,42.0);//callsmax<double>(byargument謝謝閱讀deduction)::max('a','b');//callsmax<char>(byargumentdeduction)精品文檔放心下載::max(7,42);//callsthenontemplatefortwoints感謝閱讀::max<>(7,42);//callsmax<int>(byargumentdeduction)謝謝閱讀::max<double>(7,42);//callsmax<double>(noargument感謝閱讀deduction)}精品文檔放心下載初始化為同一類型,如:max(7,42)調(diào)用匹配非模板函數(shù)也匹配模板函數(shù)。1.5模板類基本的語法定義:template<comma-separated-list-of-parameters>精品文檔放心下載classclass-name{……};具有缺省參數(shù)的模板定義形式template<typenameT,typenameAlloc=alloc>感謝閱讀classclass-name{……};精品文檔放心下載設(shè)計(jì)的思維方法:申明并不一定需要定義:1、申明一個(gè)函數(shù),并不實(shí)現(xiàn)在C++中我們可能因?yàn)榻鼓硞€(gè)缺省函數(shù)的調(diào)用操作而申明該缺省函數(shù),但感謝閱讀不定以它,例如:classtestDeclare{public:testDeclare();};我們對(duì)上面的testDeclare的缺省構(gòu)造函數(shù)進(jìn)行了聲明,但是我們并沒精品文檔放心下載有構(gòu)造函數(shù)的的定義,當(dāng)我們執(zhí)行testDeclaredeclare;上面這個(gè)申請(qǐng)創(chuàng)建一個(gè)對(duì)象的操作會(huì)被編譯系統(tǒng)所禁止當(dāng)然,我們也可以對(duì)缺省的重載運(yùn)算符實(shí)施同樣的手段2、申明一個(gè)函數(shù)而不實(shí)現(xiàn)可能是為了模板函數(shù)的泛化泛化:template<typenameT>TtestFun();特化:template<>inttestFun(){return10;}3、申明一個(gè)函數(shù)可能僅僅為了獲得特殊某一項(xiàng)功能例如:TMarkT();charTest(T);intTest(...);sizeof(MarkT());上面的例子其實(shí)就是求T類的的字節(jié)數(shù),其實(shí)在一般情況下,我們直接寫精品文檔放心下載sizeof(T)謝謝閱讀可以通過上面的例子MarkT()函數(shù),其實(shí)上面的MarkT(),charTest(T)精品文檔放心下載函數(shù)intTest(...)都是沒有定義的,但是由于sizeof是編譯時(shí)刻的精品文檔放心下載運(yùn)算,所以它并不需要關(guān)心這些函數(shù)是否實(shí)現(xiàn)。?申明一個(gè)類而不實(shí)現(xiàn)例如我們?cè)诮鼓0孱惖姆夯^程中就可以實(shí)現(xiàn)template<typenameT>classtestClass;//泛化只申明template<>classtestClass<int>//特化進(jìn)行實(shí)現(xiàn)精品文檔放心下載{};如果我們有testClass<char>test;//error精品文檔放心下載//系統(tǒng)會(huì)調(diào)用泛化時(shí)發(fā)現(xiàn)沒有沒有實(shí)現(xiàn)二產(chǎn)生編譯錯(cuò)誤testClass<int>test;//OK//系統(tǒng)調(diào)用特化故OK1.5.1模板設(shè)計(jì)基本方法A、編譯器斷言template<classT,classU>{typedefcharsmall;classbig{chardummy[2]};謝謝閱讀staticsmalltest(U);staticbigtest(…);staticTmarkT();//函數(shù)定義只是為了得到一個(gè)返回類型精品文檔放心下載public;enum{value=sizeof(test(makT()))==sizeof(Small)};精品文檔放心下載};B、模板特化template<typenameI,typenameO>精品文檔放心下載structtestClass{testClass(){count<<"I,O"<<endl;}謝謝閱讀};template<typenameT>structtestClass<T*,T*>{testClass(){count<<"T*,T*"<<endl;}感謝閱讀};C、常數(shù)映射型別template<intv>structtestClass{enum{value=v};};D、型別映射型別template<typenameT>structtestClass{typedefTOriginalType;};1.6STL標(biāo)準(zhǔn)模板庫(kù)容器?序列容器–vector,list、deque、stack(沒有迭代器)、queue(沒有迭代器)、即

stack、queue不允許遍歷行為精品文檔放心下載?關(guān)聯(lián)容器–set(標(biāo)準(zhǔn))、map(標(biāo)準(zhǔn))、hash_table、RB-tree精品文檔放心下載?通用算法?begin()、end()、size()、empty()、erase(iterator__position)、clear()迭代器謝謝閱讀迭代器的基本算法?能夠進(jìn)行+、-、++、--、+=、-=、==、!=等運(yùn)算謝謝閱讀?是一種智能性指針,實(shí)現(xiàn)operator*operator->的重載感謝閱讀?根據(jù)迭代器的特點(diǎn),迭代器又稱循環(huán)子

迭代器前閉后開區(qū)間[first,last)感謝閱讀型別?單向迭代器?可逆迭代器?隨機(jī)迭代器?迭代器的繼承關(guān)系型別萃取–value_type–difference_type–refrence_type–pointer_type–iterator_category–型別萃取機(jī)–iterator_traits算法?數(shù)值運(yùn)算–power、itoa、accu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論