版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C++中級(jí)培訓(xùn)員工培訓(xùn)中心2005年7月1日蔡利元C++中級(jí)培訓(xùn)員工培訓(xùn)中心蔡利元課程內(nèi)容第一章: 類第二章:接 口第三章:運(yùn)算符重載第四章:模板課程內(nèi)容第一章: 類基本概念類的基本特性類的應(yīng)用的特例第一章: 類基本概念基本概念
namespace
ClassnamesClassmembers MemberFunctions StaticMemberFunctions Unions C++BitFields NestedClassDeclarations TypeNamesinClassScope MultipleBaseClasses VirtualFunctions AbstractClasses ControllingAccesstoClassMembers privateMembers protectedMembers publicMembers AccessSpecifiersforBaseClasses,priavte,public、protected Friends Constructors Destructors ConversionFunctions thenewoperatorandthedeleteoperator CopyingConstructorFunctions Interface基本概念
類的基本特性構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)靜態(tài)成員與友元組合與繼承類的基本特性構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)C++規(guī)定與類同名的函數(shù)就是拷貝構(gòu)造函數(shù)默認(rèn)拷貝構(gòu)造函數(shù)在類定義中如果沒有提供自己的拷貝構(gòu)造函數(shù),則C++提供一個(gè)默認(rèn)的構(gòu)造函數(shù),其拷貝策略是逐個(gè)成員依次拷貝。深拷貝和淺拷貝默認(rèn)拷貝構(gòu)造函數(shù)均是淺拷貝但是一個(gè)類可能擁有其它資源,如其構(gòu)造函數(shù)分配了一個(gè)堆內(nèi)存,析構(gòu)函數(shù)釋放了這個(gè)內(nèi)存,則此時(shí)就需要進(jìn)行深拷貝了深拷貝不能依賴編譯器實(shí)現(xiàn)構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)C++規(guī)定與類同名的函數(shù)就是拷貝構(gòu)造函靜態(tài)成員與友元靜態(tài)成員使用static申明,在內(nèi)存中永遠(yuǎn)只有一份實(shí)例是類的對(duì)象所共有的靜態(tài)成員變量可以被成員函數(shù)訪問,但靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量友元是為了一個(gè)普通函數(shù)直接訪問一個(gè)類的保護(hù)甚至是私有成員的機(jī)制靜態(tài)成員與友元靜態(tài)成員使用static申明,在內(nèi)存中永遠(yuǎn)只組合與繼承C++最重要的性能之一是代碼重用簡單地創(chuàng)建一個(gè)包含已存在的類對(duì)象的新類,這稱為組合,has-a關(guān)系創(chuàng)建一個(gè)新類作為一個(gè)已存在類的類型,采取這個(gè)已存在類的形式,對(duì)它增加代碼,但不修改它。稱為繼承,具有is-a關(guān)系,繼承具有單一繼承和多繼承組合與繼承C++最重要的性能之一是代碼重用類的應(yīng)用的特例
繼承中的向上映射與切片問題多繼承中發(fā)生的菱形缺陷this跳轉(zhuǎn)類的應(yīng)用的特例
繼承中的向上映射與切片問題繼承中的向上映射與切片問題
如果有classB:publicA; Bb; Aa=b; 這就是切片現(xiàn)象而 B*pb=newB; A*pa=pb; 則不會(huì)發(fā)生切片,因?yàn)檫@只是指針的賦值而不涉及到切片現(xiàn)象繼承中的向上映射與切片問題
如果有classB:publ多繼承中發(fā)生的菱形缺陷菱形缺陷導(dǎo)致的原因:發(fā)生了菱形繼承,如右圖兩個(gè)缺陷:子對(duì)象重疊向上映射的二義性解決辦法:修改多繼承關(guān)系為單一繼承關(guān)系或者是組合關(guān)系進(jìn)行虛繼承多繼承中發(fā)生的菱形缺陷菱形缺陷導(dǎo)致的原因:this跳轉(zhuǎn)如右圖繼承關(guān)系對(duì)于一個(gè)已經(jīng)實(shí)例化B類的對(duì)象bObject,永遠(yuǎn)有(B*)&bObject==(A*)&bObject成立但是在多繼承的世界內(nèi),上面的等式就不能恒成立,對(duì)象的同一性受到了挑戰(zhàn)。 特別的是,在多繼承世界內(nèi)如果左下的菱形關(guān)系存在情況下,如果對(duì)于已經(jīng)實(shí)例化B類的對(duì)象bObject;(Base*)(A1*)&bObject!=(Base*)(A2*)&bObject成立,當(dāng)這種事情發(fā)生的時(shí)候我們就只能特殊處理了。這種情況在COM應(yīng)用中處處都會(huì)發(fā)生。
this跳轉(zhuǎn)如右圖繼承關(guān)系對(duì)于一個(gè)已經(jīng)實(shí)例化B類的對(duì)象bO第二章:接 口
基本知識(shí)基本特性接口應(yīng)用的特例應(yīng)用舉例第二章:接 口
基本知識(shí)基本概念ClassVirtualfunctionsPurevirtualfunctionsAbstractclassStruct&Interface基本概念Class基本特性虛函數(shù)純虛函數(shù)抽象類接口基本特性虛函數(shù)虛函數(shù)語法特性虛析構(gòu)函數(shù)虛函數(shù)語法語法
在普通成員函數(shù)前面加virtual關(guān)鍵字一個(gè)函數(shù)在基類申明一個(gè)virtual,那么在所有的派生類都是是virtual的一個(gè)函數(shù)在基類為普通函數(shù),在派生類定義為virtual的函數(shù)稱為越位語法
在普通成員函數(shù)前面加virtual關(guān)鍵字特性實(shí)施晚期綁定(即運(yùn)行時(shí)刻綁定),實(shí)施多態(tài)的一種方法具有虛函數(shù)類的虛函數(shù)表的布局如下:classvtprclass::m1class::m2特性實(shí)施晚期綁定(即運(yùn)行時(shí)刻綁定),實(shí)施多態(tài)的一種方法cla純虛函數(shù)語法:成員函數(shù)前面加virtual關(guān)鍵在,在函數(shù)申明的”)”后標(biāo)注“=0”關(guān)鍵字在申明純虛函數(shù)類中不能實(shí)現(xiàn)該函數(shù)純虛函數(shù)語法:抽象類具有純虛函數(shù)的類就是抽象類抽象類不能被實(shí)例化,所以抽象類只能以指針方式被應(yīng)用抽象類可以防止切片的發(fā)生抽象類不產(chǎn)生虛表。抽象類具有純虛函數(shù)的類就是抽象類用戶接口接口的演化與接口的必要性接口應(yīng)用特例接口應(yīng)用示例用戶接口接口的演化與接口的必要性接口的演化與接口的必要性Handle-Body模式抽象接口classHandlem_pThisclassclassvtprclass::m1class::m2接口的演化與接口的必要性Handle-Body模式clas接口應(yīng)用特例多重接口與方法名沖突問題(Siamesetwins)提出問題:假設(shè)汽車最大速度的接口為ICar,潛艇最大速度的接口為IBoat,有一個(gè)兩棲類的交通工具它可以奔跑在馬路上,也可以航行在大海中,那么它就同時(shí)擁有ICar、IBoat兩種交通工具的最大速度特性,我們定義它的接口為ICarBoat;解決問題采用中間類的解決辦法內(nèi)嵌內(nèi)的解決辦法(留給大家思考)
接口應(yīng)用特例多重接口與方法名沖突問題(Siamesetwi采用中間類的解決辦法采用中間類的解決辦法接口應(yīng)用示例抽象工廠接口應(yīng)用示例抽象工廠第二章:運(yùn)算符重載基本概念可重載和不可重載幾類特殊的運(yùn)算符重載運(yùn)算符重載的運(yùn)用第二章:運(yùn)算符重載基本概念基本概念
OverloadedFunctionsOverloadedOperatorsDeclarationMatchingArgumentMatchingArgumentTypesMatchingArgumentCountsMatchingC++UnaryOperatorsBinaryOperatorsSmartPointerFunctionObjects基本概念
OverloadedFunctions可重載和不可重載可重載運(yùn)算符+*/%^&|~!=<>+==*=/=%=^=&=|=<<>>>>=<<===!=<=>=&&||++>*,>[]()newnew[]deletedelete[]不可重載運(yùn)算符.
.*::?:###///**/可重載和不可重載可重載運(yùn)算符特殊的運(yùn)算符重載(一)運(yùn)算符[]下標(biāo)運(yùn)算符‘[]’必須是成員函數(shù)并且它需要單個(gè)參數(shù)。因?yàn)樗凳緦?duì)象像數(shù)組一樣動(dòng)作,可以經(jīng)常從這個(gè)運(yùn)算符返回一個(gè)引用,所以它可以被很方便地用于等號(hào)左側(cè)。這個(gè)運(yùn)算符經(jīng)常被重載運(yùn)算符new和delete控制動(dòng)態(tài)內(nèi)存分配,當(dāng)創(chuàng)建一個(gè)new表達(dá)式時(shí)有兩件事發(fā)生。首先,使用運(yùn)算符new分配內(nèi)存,然后調(diào)用構(gòu)造函數(shù)。在delete表達(dá)式里,調(diào)用析構(gòu)函數(shù),然后使用運(yùn)算符delete釋放內(nèi)存。我們永遠(yuǎn)無法控制構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用(否則我們可能意外地?cái)噥y它們),但可以改變內(nèi)存分配算法new和delete特殊的運(yùn)算符重載(一)運(yùn)算符[]特殊的運(yùn)算符重載(二)逗號(hào)運(yùn)算符當(dāng)逗號(hào)出現(xiàn)在逗號(hào)運(yùn)算對(duì)象左右時(shí),逗號(hào)運(yùn)算符被調(diào)用。然而,逗號(hào)運(yùn)算符在函數(shù)參數(shù)表中出現(xiàn)時(shí)不被調(diào)用重點(diǎn)介紹的運(yùn)算符轉(zhuǎn)換運(yùn)算符運(yùn)算符&(地址)運(yùn)算符->運(yùn)算符()特殊的運(yùn)算符重載(二)逗號(hào)運(yùn)算符轉(zhuǎn)換運(yùn)算符轉(zhuǎn)換函數(shù)名稱operator轉(zhuǎn)換數(shù)據(jù)類型名,如MFC中的operatorLPCSTR作用通過在關(guān)鍵字operator后跟隨想要轉(zhuǎn)換到的類型的方法,將當(dāng)前類型轉(zhuǎn)換為希望的類型構(gòu)造轉(zhuǎn)換&運(yùn)算符轉(zhuǎn)換用構(gòu)造函數(shù)技術(shù),目的類執(zhí)行轉(zhuǎn)換。然而使用運(yùn)算符技術(shù),是源類執(zhí)行轉(zhuǎn)換構(gòu)造函數(shù)技術(shù)的價(jià)值是在創(chuàng)建一個(gè)新類時(shí)為現(xiàn)有系統(tǒng)增加了新的轉(zhuǎn)換途徑。然而,創(chuàng)建一個(gè)單一參數(shù)的構(gòu)造函數(shù)總是定義一個(gè)自動(dòng)類型轉(zhuǎn)換(即使它有不止一個(gè)參數(shù)也是一樣,因?yàn)槠溆嗟膮?shù)將被缺省處理),這可能并不是我們所想要的。另外,使用構(gòu)造函數(shù)技術(shù)沒有辦法實(shí)現(xiàn)從用戶定義類型向內(nèi)置類型轉(zhuǎn)換,這只有運(yùn)算符重載可能做到。轉(zhuǎn)換運(yùn)算符轉(zhuǎn)換函數(shù)名稱運(yùn)算符&應(yīng)用:標(biāo)準(zhǔn)模板庫中的std::auto_ptrCOM中的CComPtr重載缺陷:地址是一個(gè)對(duì)象的及其基本的特性,如果某類型重載&運(yùn)算符,該類型將無法參與泛型編程對(duì)于smartptr實(shí)施的&運(yùn)算,意味著完全放棄了對(duì)擁有權(quán)的自動(dòng)管理。當(dāng)客戶直接訪問原生對(duì)象的時(shí)候,smartptr將失去它的輔助作用效應(yīng)運(yùn)算符&應(yīng)用:運(yùn)算符->Operator->機(jī)制當(dāng)你對(duì)某一型別實(shí)施operator->,而該型別并非原生指針時(shí),編譯器會(huì)繼續(xù)對(duì)執(zhí)行的結(jié)果實(shí)施operator->,直到得到一個(gè)原生指針作用SmartPointer的應(yīng)用可以對(duì)對(duì)象的成員函數(shù)實(shí)施“前調(diào)用”及“后調(diào)用”(pre-andpost-functioncalls)運(yùn)算符->Operator->機(jī)制運(yùn)算符()functorsorfunctionobjects特點(diǎn)申明象對(duì)象(實(shí)際上也是對(duì)象),調(diào)用象函數(shù)應(yīng)用廣泛應(yīng)用于STL的各種算法,實(shí)施函數(shù)配接運(yùn)算符()functorsorfunctionobj運(yùn)算符重載的運(yùn)用智能指針仿函數(shù)運(yùn)算符重載的運(yùn)用智能指針智能指針關(guān)鍵點(diǎn)重載“->”運(yùn)算符的對(duì)象作用在多線程編程中自動(dòng)進(jìn)行加解鎖操作自動(dòng)實(shí)施對(duì)象引用連接計(jì)數(shù),進(jìn)行對(duì)象的生命周期管理智能指針關(guān)鍵點(diǎn)仿函數(shù)
關(guān)鍵點(diǎn)重載“()”運(yùn)算符作用主要用于函數(shù)配接,參數(shù)配接,廣泛應(yīng)用于STL仿函數(shù)
關(guān)鍵點(diǎn)第三章:模板基本概念基本語法模板設(shè)計(jì)中的非習(xí)慣性思維模板設(shè)計(jì)的基本方法方法設(shè)計(jì)示例-STL標(biāo)準(zhǔn)模板庫模板的佳作第三章:模板基本概念基本概念typenameFunctionTemplatesClassTemplatesSTL(StandardTemplateLibrary)functors、functionadpterscontainers、iterator、traits、vector、list、deque、stack、queue、heap、set、map、hashtable、RB-treestlport、boost、loki基本概念typename基本語法template<[typelist][,[arglist]]>
declaration 這個(gè)template描述了一個(gè)參數(shù)化的類(模板類)或者是一個(gè)參數(shù)化的函數(shù)(模板函數(shù)),這個(gè)模板參數(shù)列表是用逗號(hào)分隔的類型列表(在這個(gè)表單忠使用class或者是typename來標(biāo)識(shí)這個(gè)數(shù)據(jù)類型)。在某些情況下這個(gè)模板體內(nèi)可能不存在任何的數(shù)據(jù)類型。declaration域必須是一個(gè)函數(shù)或者類的聲明基本語法template<[typelist][,[模板設(shè)計(jì)中的非習(xí)慣性思維申明并不一定要定義定義類不一定要有成員、成員不僅僅是方法和成員變量模板設(shè)計(jì)中的非習(xí)慣性思維申明并不一定要定義定義類不一定要有成員
成員不僅是方法和成員變量classEmptyType{ };template<classT>structiterator_traits{
typedeftypenameI::iterator_categoryiterator_category typedeftypenameI::value_typevalue_type; typedeftypenameI::difference_typediffernce_type; typedeftypenameI::pointerpointer; typedeftypenameI::refrencerefrence;};Template<intv>structint2type{enumvalue=v};定義類不一定要有成員
成員不僅是方法和成員變量classE申明并不一定要定義申明一個(gè)函數(shù),并不定義禁止某種缺省函數(shù)的調(diào)用申明一個(gè)函數(shù)而不實(shí)現(xiàn)可能是為了模板函數(shù)的泛化申明一個(gè)函數(shù)可能僅僅為了獲得特殊某一項(xiàng)功能申明一個(gè)類而不實(shí)現(xiàn)禁止模板類的泛化,只允許特化實(shí)施編譯某項(xiàng)功能的檢測如:編譯時(shí)刻斷言申明并不一定要定義申明一個(gè)函數(shù),并不定義模板設(shè)計(jì)的基本方法編譯器斷言模板特化局部類常數(shù)映射型別型別映射型別型別選擇Nullclassornullfunction和EmptyclassTypeTraits模板嵌套Policyclass模板設(shè)計(jì)的基本方法編譯器斷言利用模板設(shè)計(jì)的方法解題編譯時(shí)刻測試類型的可轉(zhuǎn)換性用到的技術(shù):只定義不實(shí)現(xiàn)函數(shù)多態(tài)性可變參函數(shù)sizeoftemplate<classT,classU>{ typedefcharsmall;classbig{chardummy[2]}; staticsmalltest(U); 只定義不實(shí)現(xiàn) staticbigtest(…) ; staticTmarkT(); //函數(shù)定義只是為了得到一個(gè)返回類型public; enum{value=sizeof(test(makT()))==sizeof(Small)};};利用模板設(shè)計(jì)的方法解題編譯時(shí)刻測試類型的可轉(zhuǎn)換性STL標(biāo)準(zhǔn)模板庫容器迭代器算法仿函數(shù)配接器STL標(biāo)準(zhǔn)模板庫容器容器
序列容器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ìn)行+、-、++、--、+=、-=、=型別單向迭代器可逆迭代器隨機(jī)迭代器迭代器的繼承關(guān)系:
型別單向迭代器型別萃取型別value_typedifference_typerefrence_typepointer_typeiterator_category型別萃取機(jī)iterator_traits型別萃取型別算法數(shù)值運(yùn)算power、itoa、accumulate基本運(yùn)算fill、fill_n、swap、max、min、iter_swap、copy集合運(yùn)算set_union、set_interseion、set_diffrence數(shù)據(jù)整理(以循環(huán)子為參數(shù))count、count_if、find、find_if、for_each、merge、sort、upper、search、search_n算法數(shù)值運(yùn)算仿函數(shù)一元仿函數(shù)二元仿函數(shù)二元化一元仿函數(shù)仿函數(shù)應(yīng)用仿函數(shù)一元仿函數(shù)一元仿函數(shù)template<class_Arg,class_Result>structunary_function{typedef_Argargument_type;typedef_Resultresult_type;};template<class_Tp>structnegate:publicunary_function<T,T>{_Tpoperator()(constT&x)const{return–x;}}:一元仿函數(shù)template<class_Arg,cla二元仿函數(shù)template<class_Tp>structless:publicbinary_function<_Tp,_Tp,bool>{booloperator()(const_Tp&__x,const_Tp&__y)const{return__x<__y;}};二元仿函數(shù)template<class_Tp>二元化一元仿函數(shù)Classbinder1st{binder1st(constOperation&op,constT1&y);operator()(constT2&x);}二元化一元仿函數(shù)Classbinder1st仿函數(shù)應(yīng)用template<class_InputIter,classOperation> inline_InputIter__find_if(_InputIter__first,_InputIter__last,Operation__op,constinput_iterator_tag&){while(__first!=__last&&!__op(*__first))++__first;return__first;}仿函數(shù)應(yīng)用template<class_InputIte配接器容器配接器stackQueue迭代配接器ReverseIteratorsIOStreamIteratorsInert_Iterator仿函數(shù)配接器配接器容器配接器容器配接器容器配接器Stack template<class_Tp,class_Sequence=deque<_Tp>>classstack{ }Queue queue<int,list<int>>myQueue;容器配接器容器配接器仿函數(shù)配接器綁定bind1st、bind2ndop(x,param)orop(param,x)修飾not1、not2!op(param)or!op(param1,param2)組合compose1、compose2op1(op2(param));仿函數(shù)配接器綁定仿函數(shù)配接器函數(shù)配接ptr_fun1、ptr_fun2fp(param)orfp(param1,param2)對(duì)象配接mem_fun、mem_fun_ref、mem_fun1、mem_fun1_ref(param->*f)()or(param.*f)()or(param->*f)(x)or(param.*f)(x)仿函數(shù)配接器函數(shù)配接仿函數(shù)配接器舉例不小于x表達(dá)式not1(bind2nd(less<int>(),x))f(g(x))的表達(dá)式Compose1(f,g)find_if(first,end,mem_fun(&clsss::fun));仿函數(shù)配接器舉例STL庫引用標(biāo)準(zhǔn)引用辦法#include<vector>#include<list>usingnamespacestd;錯(cuò)誤引用辦法#include<vector.h>#include<list.h>STL庫引用標(biāo)準(zhǔn)引用辦法參考資料C++ProgrammingLanguageC++Primerthinkinginc++effectivec++C++TemplatesSTL源碼剖析ModernC++Design設(shè)計(jì)模式COM本質(zhì)論參考資料C++ProgrammingLanguage共享源代碼ICE(中間件編程)ACE(跨平臺(tái)網(wǎng)絡(luò)編程)Stlportboost(標(biāo)準(zhǔn)C++委員會(huì)的杰作)Loki共享源代碼ICE(中間件編程)謝謝謝謝演講完畢,謝謝觀看!演講完畢,謝謝觀看!C++中級(jí)培訓(xùn)員工培訓(xùn)中心2005年7月1日蔡利元C++中級(jí)培訓(xùn)員工培訓(xùn)中心蔡利元課程內(nèi)容第一章: 類第二章:接 口第三章:運(yùn)算符重載第四章:模板課程內(nèi)容第一章: 類基本概念類的基本特性類的應(yīng)用的特例第一章: 類基本概念基本概念
namespace
ClassnamesClassmembers MemberFunctions StaticMemberFunctions Unions C++BitFields NestedClassDeclarations TypeNamesinClassScope MultipleBaseClasses VirtualFunctions AbstractClasses ControllingAccesstoClassMembers privateMembers protectedMembers publicMembers AccessSpecifiersforBaseClasses,priavte,public、protected Friends Constructors Destructors ConversionFunctions thenewoperatorandthedeleteoperator CopyingConstructorFunctions Interface基本概念
類的基本特性構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)靜態(tài)成員與友元組合與繼承類的基本特性構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)C++規(guī)定與類同名的函數(shù)就是拷貝構(gòu)造函數(shù)默認(rèn)拷貝構(gòu)造函數(shù)在類定義中如果沒有提供自己的拷貝構(gòu)造函數(shù),則C++提供一個(gè)默認(rèn)的構(gòu)造函數(shù),其拷貝策略是逐個(gè)成員依次拷貝。深拷貝和淺拷貝默認(rèn)拷貝構(gòu)造函數(shù)均是淺拷貝但是一個(gè)類可能擁有其它資源,如其構(gòu)造函數(shù)分配了一個(gè)堆內(nèi)存,析構(gòu)函數(shù)釋放了這個(gè)內(nèi)存,則此時(shí)就需要進(jìn)行深拷貝了深拷貝不能依賴編譯器實(shí)現(xiàn)構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)C++規(guī)定與類同名的函數(shù)就是拷貝構(gòu)造函靜態(tài)成員與友元靜態(tài)成員使用static申明,在內(nèi)存中永遠(yuǎn)只有一份實(shí)例是類的對(duì)象所共有的靜態(tài)成員變量可以被成員函數(shù)訪問,但靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量友元是為了一個(gè)普通函數(shù)直接訪問一個(gè)類的保護(hù)甚至是私有成員的機(jī)制靜態(tài)成員與友元靜態(tài)成員使用static申明,在內(nèi)存中永遠(yuǎn)只組合與繼承C++最重要的性能之一是代碼重用簡單地創(chuàng)建一個(gè)包含已存在的類對(duì)象的新類,這稱為組合,has-a關(guān)系創(chuàng)建一個(gè)新類作為一個(gè)已存在類的類型,采取這個(gè)已存在類的形式,對(duì)它增加代碼,但不修改它。稱為繼承,具有is-a關(guān)系,繼承具有單一繼承和多繼承組合與繼承C++最重要的性能之一是代碼重用類的應(yīng)用的特例
繼承中的向上映射與切片問題多繼承中發(fā)生的菱形缺陷this跳轉(zhuǎn)類的應(yīng)用的特例
繼承中的向上映射與切片問題繼承中的向上映射與切片問題
如果有classB:publicA; Bb; Aa=b; 這就是切片現(xiàn)象而 B*pb=newB; A*pa=pb; 則不會(huì)發(fā)生切片,因?yàn)檫@只是指針的賦值而不涉及到切片現(xiàn)象繼承中的向上映射與切片問題
如果有classB:publ多繼承中發(fā)生的菱形缺陷菱形缺陷導(dǎo)致的原因:發(fā)生了菱形繼承,如右圖兩個(gè)缺陷:子對(duì)象重疊向上映射的二義性解決辦法:修改多繼承關(guān)系為單一繼承關(guān)系或者是組合關(guān)系進(jìn)行虛繼承多繼承中發(fā)生的菱形缺陷菱形缺陷導(dǎo)致的原因:this跳轉(zhuǎn)如右圖繼承關(guān)系對(duì)于一個(gè)已經(jīng)實(shí)例化B類的對(duì)象bObject,永遠(yuǎn)有(B*)&bObject==(A*)&bObject成立但是在多繼承的世界內(nèi),上面的等式就不能恒成立,對(duì)象的同一性受到了挑戰(zhàn)。 特別的是,在多繼承世界內(nèi)如果左下的菱形關(guān)系存在情況下,如果對(duì)于已經(jīng)實(shí)例化B類的對(duì)象bObject;(Base*)(A1*)&bObject!=(Base*)(A2*)&bObject成立,當(dāng)這種事情發(fā)生的時(shí)候我們就只能特殊處理了。這種情況在COM應(yīng)用中處處都會(huì)發(fā)生。
this跳轉(zhuǎn)如右圖繼承關(guān)系對(duì)于一個(gè)已經(jīng)實(shí)例化B類的對(duì)象bO第二章:接 口
基本知識(shí)基本特性接口應(yīng)用的特例應(yīng)用舉例第二章:接 口
基本知識(shí)基本概念ClassVirtualfunctionsPurevirtualfunctionsAbstractclassStruct&Interface基本概念Class基本特性虛函數(shù)純虛函數(shù)抽象類接口基本特性虛函數(shù)虛函數(shù)語法特性虛析構(gòu)函數(shù)虛函數(shù)語法語法
在普通成員函數(shù)前面加virtual關(guān)鍵字一個(gè)函數(shù)在基類申明一個(gè)virtual,那么在所有的派生類都是是virtual的一個(gè)函數(shù)在基類為普通函數(shù),在派生類定義為virtual的函數(shù)稱為越位語法
在普通成員函數(shù)前面加virtual關(guān)鍵字特性實(shí)施晚期綁定(即運(yùn)行時(shí)刻綁定),實(shí)施多態(tài)的一種方法具有虛函數(shù)類的虛函數(shù)表的布局如下:classvtprclass::m1class::m2特性實(shí)施晚期綁定(即運(yùn)行時(shí)刻綁定),實(shí)施多態(tài)的一種方法cla純虛函數(shù)語法:成員函數(shù)前面加virtual關(guān)鍵在,在函數(shù)申明的”)”后標(biāo)注“=0”關(guān)鍵字在申明純虛函數(shù)類中不能實(shí)現(xiàn)該函數(shù)純虛函數(shù)語法:抽象類具有純虛函數(shù)的類就是抽象類抽象類不能被實(shí)例化,所以抽象類只能以指針方式被應(yīng)用抽象類可以防止切片的發(fā)生抽象類不產(chǎn)生虛表。抽象類具有純虛函數(shù)的類就是抽象類用戶接口接口的演化與接口的必要性接口應(yīng)用特例接口應(yīng)用示例用戶接口接口的演化與接口的必要性接口的演化與接口的必要性Handle-Body模式抽象接口classHandlem_pThisclassclassvtprclass::m1class::m2接口的演化與接口的必要性Handle-Body模式clas接口應(yīng)用特例多重接口與方法名沖突問題(Siamesetwins)提出問題:假設(shè)汽車最大速度的接口為ICar,潛艇最大速度的接口為IBoat,有一個(gè)兩棲類的交通工具它可以奔跑在馬路上,也可以航行在大海中,那么它就同時(shí)擁有ICar、IBoat兩種交通工具的最大速度特性,我們定義它的接口為ICarBoat;解決問題采用中間類的解決辦法內(nèi)嵌內(nèi)的解決辦法(留給大家思考)
接口應(yīng)用特例多重接口與方法名沖突問題(Siamesetwi采用中間類的解決辦法采用中間類的解決辦法接口應(yīng)用示例抽象工廠接口應(yīng)用示例抽象工廠第二章:運(yùn)算符重載基本概念可重載和不可重載幾類特殊的運(yùn)算符重載運(yùn)算符重載的運(yùn)用第二章:運(yùn)算符重載基本概念基本概念
OverloadedFunctionsOverloadedOperatorsDeclarationMatchingArgumentMatchingArgumentTypesMatchingArgumentCountsMatchingC++UnaryOperatorsBinaryOperatorsSmartPointerFunctionObjects基本概念
OverloadedFunctions可重載和不可重載可重載運(yùn)算符+*/%^&|~!=<>+==*=/=%=^=&=|=<<>>>>=<<===!=<=>=&&||++>*,>[]()newnew[]deletedelete[]不可重載運(yùn)算符.
.*::?:###///**/可重載和不可重載可重載運(yùn)算符特殊的運(yùn)算符重載(一)運(yùn)算符[]下標(biāo)運(yùn)算符‘[]’必須是成員函數(shù)并且它需要單個(gè)參數(shù)。因?yàn)樗凳緦?duì)象像數(shù)組一樣動(dòng)作,可以經(jīng)常從這個(gè)運(yùn)算符返回一個(gè)引用,所以它可以被很方便地用于等號(hào)左側(cè)。這個(gè)運(yùn)算符經(jīng)常被重載運(yùn)算符new和delete控制動(dòng)態(tài)內(nèi)存分配,當(dāng)創(chuàng)建一個(gè)new表達(dá)式時(shí)有兩件事發(fā)生。首先,使用運(yùn)算符new分配內(nèi)存,然后調(diào)用構(gòu)造函數(shù)。在delete表達(dá)式里,調(diào)用析構(gòu)函數(shù),然后使用運(yùn)算符delete釋放內(nèi)存。我們永遠(yuǎn)無法控制構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用(否則我們可能意外地?cái)噥y它們),但可以改變內(nèi)存分配算法new和delete特殊的運(yùn)算符重載(一)運(yùn)算符[]特殊的運(yùn)算符重載(二)逗號(hào)運(yùn)算符當(dāng)逗號(hào)出現(xiàn)在逗號(hào)運(yùn)算對(duì)象左右時(shí),逗號(hào)運(yùn)算符被調(diào)用。然而,逗號(hào)運(yùn)算符在函數(shù)參數(shù)表中出現(xiàn)時(shí)不被調(diào)用重點(diǎn)介紹的運(yùn)算符轉(zhuǎn)換運(yùn)算符運(yùn)算符&(地址)運(yùn)算符->運(yùn)算符()特殊的運(yùn)算符重載(二)逗號(hào)運(yùn)算符轉(zhuǎn)換運(yùn)算符轉(zhuǎn)換函數(shù)名稱operator轉(zhuǎn)換數(shù)據(jù)類型名,如MFC中的operatorLPCSTR作用通過在關(guān)鍵字operator后跟隨想要轉(zhuǎn)換到的類型的方法,將當(dāng)前類型轉(zhuǎn)換為希望的類型構(gòu)造轉(zhuǎn)換&運(yùn)算符轉(zhuǎn)換用構(gòu)造函數(shù)技術(shù),目的類執(zhí)行轉(zhuǎn)換。然而使用運(yùn)算符技術(shù),是源類執(zhí)行轉(zhuǎn)換構(gòu)造函數(shù)技術(shù)的價(jià)值是在創(chuàng)建一個(gè)新類時(shí)為現(xiàn)有系統(tǒng)增加了新的轉(zhuǎn)換途徑。然而,創(chuàng)建一個(gè)單一參數(shù)的構(gòu)造函數(shù)總是定義一個(gè)自動(dòng)類型轉(zhuǎn)換(即使它有不止一個(gè)參數(shù)也是一樣,因?yàn)槠溆嗟膮?shù)將被缺省處理),這可能并不是我們所想要的。另外,使用構(gòu)造函數(shù)技術(shù)沒有辦法實(shí)現(xiàn)從用戶定義類型向內(nèi)置類型轉(zhuǎn)換,這只有運(yùn)算符重載可能做到。轉(zhuǎn)換運(yùn)算符轉(zhuǎn)換函數(shù)名稱運(yùn)算符&應(yīng)用:標(biāo)準(zhǔn)模板庫中的std::auto_ptrCOM中的CComPtr重載缺陷:地址是一個(gè)對(duì)象的及其基本的特性,如果某類型重載&運(yùn)算符,該類型將無法參與泛型編程對(duì)于smartptr實(shí)施的&運(yùn)算,意味著完全放棄了對(duì)擁有權(quán)的自動(dòng)管理。當(dāng)客戶直接訪問原生對(duì)象的時(shí)候,smartptr將失去它的輔助作用效應(yīng)運(yùn)算符&應(yīng)用:運(yùn)算符->Operator->機(jī)制當(dāng)你對(duì)某一型別實(shí)施operator->,而該型別并非原生指針時(shí),編譯器會(huì)繼續(xù)對(duì)執(zhí)行的結(jié)果實(shí)施operator->,直到得到一個(gè)原生指針作用SmartPointer的應(yīng)用可以對(duì)對(duì)象的成員函數(shù)實(shí)施“前調(diào)用”及“后調(diào)用”(pre-andpost-functioncalls)運(yùn)算符->Operator->機(jī)制運(yùn)算符()functorsorfunctionobjects特點(diǎn)申明象對(duì)象(實(shí)際上也是對(duì)象),調(diào)用象函數(shù)應(yīng)用廣泛應(yīng)用于STL的各種算法,實(shí)施函數(shù)配接運(yùn)算符()functorsorfunctionobj運(yùn)算符重載的運(yùn)用智能指針仿函數(shù)運(yùn)算符重載的運(yùn)用智能指針智能指針關(guān)鍵點(diǎn)重載“->”運(yùn)算符的對(duì)象作用在多線程編程中自動(dòng)進(jìn)行加解鎖操作自動(dòng)實(shí)施對(duì)象引用連接計(jì)數(shù),進(jìn)行對(duì)象的生命周期管理智能指針關(guān)鍵點(diǎn)仿函數(shù)
關(guān)鍵點(diǎn)重載“()”運(yùn)算符作用主要用于函數(shù)配接,參數(shù)配接,廣泛應(yīng)用于STL仿函數(shù)
關(guān)鍵點(diǎn)第三章:模板基本概念基本語法模板設(shè)計(jì)中的非習(xí)慣性思維模板設(shè)計(jì)的基本方法方法設(shè)計(jì)示例-STL標(biāo)準(zhǔn)模板庫模板的佳作第三章:模板基本概念基本概念typenameFunctionTemplatesClassTemplatesSTL(StandardTemplateLibrary)functors、functionadpterscontainers、iterator、traits、vector、list、deque、stack、queue、heap、set、map、hashtable、RB-treestlport、boost、loki基本概念typename基本語法template<[typelist][,[arglist]]>
declaration 這個(gè)template描述了一個(gè)參數(shù)化的類(模板類)或者是一個(gè)參數(shù)化的函數(shù)(模板函數(shù)),這個(gè)模板參數(shù)列表是用逗號(hào)分隔的類型列表(在這個(gè)表單忠使用class或者是typename來標(biāo)識(shí)這個(gè)數(shù)據(jù)類型)。在某些情況下這個(gè)模板體內(nèi)可能不存在任何的數(shù)據(jù)類型。declaration域必須是一個(gè)函數(shù)或者類的聲明基本語法template<[typelist][,[模板設(shè)計(jì)中的非習(xí)慣性思維申明并不一定要定義定義類不一定要有成員、成員不僅僅是方法和成員變量模板設(shè)計(jì)中的非習(xí)慣性思維申明并不一定要定義定義類不一定要有成員
成員不僅是方法和成員變量classEmptyType{ };template<classT>structiterator_traits{
typedeftypenameI::iterator_categoryiterator_category typedeftypenameI::value_typevalue_type; typedeftypenameI::difference_typediffernce_type; typedeftypenameI::pointerpointer; typedeftypenameI::refrencerefrence;};Template<intv>structint2type{enumvalue=v};定義類不一定要有成員
成員不僅是方法和成員變量classE申明并不一定要定義申明一個(gè)函數(shù),并不定義禁止某種缺省函數(shù)的調(diào)用申明一個(gè)函數(shù)而不實(shí)現(xiàn)可能是為了模板函數(shù)的泛化申明一個(gè)函數(shù)可能僅僅為了獲得特殊某一項(xiàng)功能申明一個(gè)類而不實(shí)現(xiàn)禁止模板類的泛化,只允許特化實(shí)施編譯某項(xiàng)功能的檢測如:編譯時(shí)刻斷言申明并不一定要定義申明一個(gè)函數(shù),并不定義模板設(shè)計(jì)的基本方法編譯器斷言模板特化局部類常數(shù)映射型別型別映射型別型別選擇Nullclassornullfunction和EmptyclassTypeTraits模板嵌套Policyclass模板設(shè)計(jì)的基本方法編譯器斷言利用模板設(shè)計(jì)的方法解題編譯時(shí)刻測試類型的可轉(zhuǎn)換性用到的技術(shù):只定義不實(shí)現(xiàn)函數(shù)多態(tài)性可變參函數(shù)sizeoftemplate<classT,classU>{ typedefcharsmall;classbig{chardummy[2]}; staticsmalltest(U); 只定義不實(shí)現(xiàn) staticbigtest(…) ; staticTmarkT(); //函數(shù)定義只是為了得到一個(gè)返回類型public; enum{value=sizeof(test(makT()))==sizeof(Small)};};利用模板設(shè)計(jì)的方法解題編譯時(shí)刻測試類型的可轉(zhuǎn)換性STL標(biāo)準(zhǔn)模板庫容器迭代器算法仿函數(shù)配接器STL標(biāo)準(zhǔn)模板庫容器容器
序列容器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ìn)行+、-、++、--、+=、-=、=型別單向迭代器可逆迭代器隨機(jī)迭代器迭代器的繼承關(guān)系:
型別單向迭代器型別萃取型別value_typedifference_typerefrence_typepointer_typeiterator_category型別萃取機(jī)iterator_traits型別萃取型別算法數(shù)值運(yùn)算power、itoa、accumulate基本運(yùn)算fill、fill_n、swap、max、min、iter_swap、copy集合運(yùn)算set_union、set_interseion、set_diffrence數(shù)據(jù)整理(以循環(huán)子為參數(shù))count、count_if、find、find_if、for_each、merge、sort、upper、search、search_n算法數(shù)值運(yùn)算仿函數(shù)一元仿函數(shù)二元仿函數(shù)二元化一元仿函數(shù)仿函數(shù)應(yīng)用仿函數(shù)一元仿函數(shù)一元仿函數(shù)template<class_Arg,class_Result>structunary_function{typedef_Argargument_type;typedef_Resultresult_typ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 超市物業(yè)收費(fèi)管理制度內(nèi)容(3篇)
- 集體畫畫策劃活動(dòng)方案(3篇)
- 《GA 948-2011警用攀登突擊車》專題研究報(bào)告:標(biāo)準(zhǔn)深度與未來應(yīng)用前瞻
- 《GA 658.5-2006互聯(lián)網(wǎng)公共上網(wǎng)服務(wù)場所信息安全管理系統(tǒng) 信息代碼 第5部分:遠(yuǎn)程通信端代碼》專題研究報(bào)告
- 企業(yè)員工培訓(xùn)與技能發(fā)展計(jì)劃制度
- 企業(yè)內(nèi)部保密工作責(zé)任追究制度
- 2026湖南岳陽市平江縣縣直(街道)單位遴選(選調(diào))36人參考題庫附答案
- 2026湖南長沙市明德望城學(xué)校上學(xué)期校聘教師招聘6人考試備考題庫附答案
- 2026福建廈門市翔安投資集團(tuán)有限公司招聘2人(第一期)參考題庫附答案
- 2026福建省福州市潤樓教育科技集團(tuán)有限公司招聘1人參考題庫附答案
- 柴油維修技術(shù)培訓(xùn)課件
- 2026院感知識(shí)考試題及答案
- 《紅樓夢》導(dǎo)讀 (教學(xué)課件) -高中語文人教統(tǒng)編版必修下冊
- 安徽省九師聯(lián)盟2025-2026學(xué)年高三(1月)第五次質(zhì)量檢測英語(含答案)
- (2025年)四川省自貢市紀(jì)委監(jiān)委公開遴選公務(wù)員筆試試題及答案解析
- 2025年度骨科護(hù)理部年終工作總結(jié)及工作計(jì)劃
- 2026安徽省農(nóng)村信用社聯(lián)合社面向社會(huì)招聘農(nóng)商銀行高級(jí)管理人員參考考試試題及答案解析
- 室外供熱管道安裝監(jiān)理實(shí)施細(xì)則
- 巖板采購合同范本
- 腰背部推拿課件
- 通信管道施工質(zhì)量管理流程解析
評(píng)論
0/150
提交評(píng)論