freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

改善程序設(shè)計(jì)技術(shù)的50個(gè)有效做法第二版20xx3scott(編輯修改稿)

2025-08-15 03:04 本頁面
 

【文章內(nèi)容簡(jiǎn)介】 0。staticvoid*operatornew(size_tsize)。staticvoidoperatordelete(void*p,size_tsize)?!璸rivate:AirplaneRep*rep。staticPoolmemPool。//Airplane的 memorypool}。inlinevoidAirline::operatornew(size_tsize){return(size)。}inlinevoidAirline::operatordelete(void*p,size_tsize){(p,size)。}為 Airplane的 memPool初始化, 要放在Airplane類實(shí)現(xiàn)的文件里PoolAirplane::memPool(sizeof(Airplane))。構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值運(yùn)算符構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值運(yùn)算用來產(chǎn)生一個(gè)新對(duì)象并初始化,撤銷一個(gè)對(duì)象并收回占有的內(nèi)存,為已有的對(duì)象賦一個(gè)新值。不能有錯(cuò),必須將他們徹底搞清楚。11. class內(nèi)有成員指針并動(dòng)態(tài)配置內(nèi)存時(shí),一定要有拷貝構(gòu)造函數(shù),賦值運(yùn)算符重載classString{public:String(constchar*value)。~String()?!?//沒有拷貝構(gòu)造函數(shù),//也沒有賦值運(yùn)算符重載private:char*data。}。String::String(constchar*value){if(value){data=newchar[strlen(value)+1]。strcopy(data,value)。}else{data=newchar[1]。*data=“\0”。}}inlineString::~String(){delete[]data。}Stringa(“Hello”)。Stringb(“World”)。b=a。Hello Worlda bdata data由于沒有自定義的賦值函數(shù),只能用 C++產(chǎn)生的默認(rèn)賦值函數(shù),它簡(jiǎn)單地將 b的成員指針 data指向 ,引起 字符串 “World”占有的內(nèi)存遺失。而且 ,其中一個(gè)被析構(gòu)時(shí)另一個(gè)就丟失了??截悩?gòu)造函數(shù)用來傳值,voiddonothing(Stringla){}Strings=“thetruthisoutofthere”。donothing(s)。當(dāng)函數(shù) donothing完成任務(wù)后,參數(shù) s所含的指針被析構(gòu), la被刪除。即便 la不再使用,將來又一次析構(gòu) la會(huì)造成問題。解決的辦法就是自己定義拷貝構(gòu)造函數(shù),賦值函數(shù)重載。如果確信永不使用這些函數(shù),把他們定義為私有函數(shù),而且不實(shí)現(xiàn)。一旦出錯(cuò),編譯器會(huì)給出錯(cuò)誤提示。12構(gòu)造函數(shù)中盡量以初始化代替賦值一個(gè)類中的 const成員數(shù)據(jù)和 reference引用數(shù)據(jù)只能被初始化,不能被賦值。即便沒有 const成員數(shù)據(jù)和 reference引用數(shù)據(jù),初始化也比賦值效率高。構(gòu)造函數(shù)分兩個(gè)階段實(shí)現(xiàn):1.數(shù)據(jù)成員初始化。2.調(diào)用構(gòu)造函數(shù)。數(shù)據(jù)成員賦值要調(diào)用構(gòu)造函數(shù),再調(diào)用賦值函數(shù),做兩次調(diào)用影響效率。初始化也容易維護(hù),修改。有一種例外: 一個(gè)類內(nèi)有大量數(shù)據(jù)成員時(shí),賦值比初始化效率高。classManyDataMbs{public:ManyDataMbs()ManyDataMbs( constManyDataMbsamp。x) 。private:inta,b,c,d,e,f,g,h。doublei,j,k,l,m。voidinit()。//用來將數(shù)據(jù)成員初始化,不做他用}。voidManyDataMbs::init(){a=b=c=d=e=f=g=h=1。i=j=k=l=m=0。}ManyDataMbs::ManyDataMbs(){init()?!瓆ManyDataMbs:: ManyDataMbs(constManyDataMbsamp。x){init()。……}靜態(tài)數(shù)據(jù)成員 staticclassmember不應(yīng)該在構(gòu)造函數(shù)中初始化。靜態(tài)數(shù)據(jù)成員只能初始化一次,不能初始化多次。12.數(shù)據(jù)成員初始化的次序應(yīng)該和類內(nèi)聲明的次序相同templateclassTclassArray//有上下界的數(shù)組{public:Array(intlowBound,inthighBound)。……private:vectorTdata。//數(shù)組數(shù)據(jù)存儲(chǔ)于一個(gè) vector對(duì)象 data中size_tsize。//數(shù)組中元素的個(gè)數(shù)intlBound,hBound。//上下界};templateclassTArrayT::Array(intlowBound,inthighBound):size(highBoundlowBound+1),lBound(lowBound),hBound(highBound),data(size){}實(shí)際初始化中, data先被初始化,然后 size,lBound,hBound.這樣數(shù)組中,究竟有多少個(gè)元素?zé)o法確定。基類成員總是比導(dǎo)出類先初始化。多重繼承時(shí)初始化的先后次序要十分小心。14. 總是讓基類擁有虛析構(gòu)函數(shù)一個(gè)軍事應(yīng)用軟件classEnemyTarget{public:EnemyTarget(){++numTargets。}EnemyTarget(constEnemyTargetamp。){++numTargets。}~EnemyTarget(){numTargets。}staticsize_tnumberOfTargets(){returnnumTargets。}virtualbooldestroy()。//摧毀敵方目標(biāo)是否成功private:staticsize_tnumTargets。//對(duì)象計(jì)數(shù)器 };size_tEnemyTarget::numTargets。//靜態(tài)成員初始化為 0,放在類外classEnemyTank:publicEnemyTarget{public:EnemyTank(){++numTanks。}EnemyTank(constEnemyTankamp。){++numTanks。}~EnemyTank(){numTanks。}staticsize_tnumberOfTanks(){returnnumTanks。}virtualbooldestroy()。//摧毀敵方坦克是否成功private:staticsize_tnumTanks。//敵方坦克計(jì)數(shù)器 };EnemyTarget*targetPtr=newEnemyTank?!璬eletetargetPtr。//未定義,計(jì)數(shù)出錯(cuò),影響戰(zhàn)斗勝敗 解決辦法,把 EnemyTarget類中的析構(gòu)函數(shù)定義為 virtual即可。幾乎所有的基類都有虛函數(shù),只要有一個(gè)虛函數(shù),就要把析構(gòu)函數(shù)定義為虛函數(shù)。沒有虛函數(shù)的類,有繼承派生類對(duì)象析構(gòu),也要定義虛析構(gòu)函數(shù)。但虛函數(shù)會(huì)增加內(nèi)存開銷。完全不必要時(shí)不要用虛析構(gòu)函數(shù)。聲明一個(gè)抽象類,可以加一個(gè)純虛析構(gòu)函數(shù)。15. 讓 operator=返回 *this的引用referenceC語言中 operator=的原型Camp。C::operator=(constCamp。)。charx,y,z。x=y=z=‘a(chǎn)’。x,operator=(=(=‘a(chǎn)’))。=的返回值是 =的實(shí)參。他們應(yīng)該有相同的類型。但不要讓 operator=返回 void類型, const類型Strinamp。String::operator=(constStringamp。rhs){……return*this。//返回一個(gè)引用指向左側(cè)對(duì)象 }Strinamp。String::operator=(constStringamp。rhs){……returnrhs。//返回一個(gè)引用指向右側(cè)對(duì)象,錯(cuò)誤 }后一個(gè)返回值,編譯器無法編譯,無法返回const類型 .如果參數(shù)中去掉 const變成:Strinamp。String::operator=(Stringamp。rhs);X=‘a(chǎn)’。//無法編譯 rhs應(yīng)該是一個(gè)變量。結(jié)論:必須返回 *this。16. 在 operator=中為所有的數(shù)據(jù)成員賦值基類中這不成問題,在派生類中要小心。正確的賦值運(yùn)算Derivedamp。Derived::operator=(constDrivedamp。rhs){if(this==amp。rhs)return*this。Base::operator=(rhs)。//調(diào)用基類的賦值運(yùn)算data=return*this。}Derivedamp。Derived::operator=(constDrivedamp。rhs){if(this==amp。rhs)return*this。static_castBaseamp。(*this)=rhs。//*this強(qiáng)制轉(zhuǎn)換成基類的引用賦值基類成員data=return*this。}拷貝構(gòu)造函數(shù)中要調(diào)用基類構(gòu)造函數(shù)。用第一種方法在 operator=中檢查是否 “自己賦值給自己 ”classX{……}。Xa。Xamp。b=a。//b是 a的別名 (aliasing)a=b。//自己賦值給自己 合法在賦值函數(shù)中要特別謹(jǐn)慎的處理自己的別名賦值給自己的問題。提高效率 先做檢查,一發(fā)現(xiàn)自己賦值給自己立即返回。導(dǎo)出類的賦值運(yùn)算重載中一定要先檢查,可以節(jié)省許多工作確保正確性 賦值運(yùn)算通常要先將左邊對(duì)象的資源釋放,再行賦值。如果有自己賦值給自己的現(xiàn)象,這個(gè)資源可能丟失,不可挽回了。如何判斷兩個(gè)對(duì)象是同一個(gè)對(duì)象?不是對(duì)象的內(nèi)容相同,而是看他們的地址是否相同。Xamp。X::operator=(constXamp。rhs){if(this==amp。rhs)return*this?!瓆aliasing問題不限于賦值運(yùn)算內(nèi),只要用到指針或引用,就可能出現(xiàn)。這時(shí)我們就要當(dāng)心,不要誤刪了有用的資源。類和函數(shù)的設(shè)計(jì)和申明設(shè)計(jì)一個(gè)高效率的類型( class型別),必須先回答下列問題對(duì)象如何產(chǎn)生和銷毀?確定構(gòu)造函數(shù)和析構(gòu)函數(shù)的設(shè)計(jì)。對(duì)象的初始化和賦值有什么不同?決定構(gòu)造函數(shù)和賦值函數(shù)的設(shè)計(jì)。對(duì)象如何傳值決定拷貝構(gòu)造函數(shù)的設(shè)計(jì)確定合法的范圍 成員數(shù)據(jù)的定義域確定做什么檢查,何時(shí)拋出異常判斷是否能從已有的類繼承如果能繼承,注意受基類哪些約束,哪些要用虛函數(shù)。允許那種類型轉(zhuǎn)換構(gòu)造函數(shù)可以用作隱式類型轉(zhuǎn)換,顯式類型轉(zhuǎn)換要自定義。新類型需要哪些運(yùn)算和函數(shù)確定 class的接口。哪些運(yùn)算和函數(shù)必須禁用放到 private成員中。新類型的對(duì)象可調(diào)用哪些函數(shù)確定公有成員函數(shù),保護(hù)成員函數(shù),私有成員函數(shù)。是否通用類型確定是否要用類模板18.努力讓接口完滿( plete) 且最小化客戶端接口 ( clientinterface) 指公有成員,一般只有公有函數(shù),不要有公有數(shù)據(jù)。完滿接口 允許客戶做合理要求的任意事情。最小化接口 盡量讓函數(shù)個(gè)數(shù)最少。不能有功能重疊的函數(shù)。太多函數(shù)不容易被理解,不易維護(hù),浪費(fèi)資源。如果增加一個(gè)函數(shù),使新類型更方便使用,就可以增加。Tamp。operator[](intindex)。//傳回?cái)?shù)組的一個(gè)元素,可讀,可寫constTamp。operator[](intindex)const。//傳回?cái)?shù)組的一個(gè)元素,可讀,不可寫19.區(qū)分成員函數(shù)、非成員函數(shù) 和友元函數(shù)成員函數(shù)可以動(dòng)態(tài)綁定,可以用 virtual非成員函數(shù)不能用 virtual,非成員函數(shù)能不做友元盡量不做友元函數(shù)。非成員函數(shù)要調(diào)用類中私有數(shù)據(jù)成員或私有函數(shù),則一定要聲明為友元。不要讓 operaor和 operator成為類的成員函數(shù) ,必要時(shí)作友元。要讓函數(shù)式左邊對(duì)象做類型轉(zhuǎn)換,就不能做成員函數(shù)。例子classplex{……plexoperator*(plexrhs)const。private:floatx,y。}。plexa(1,2),b(,4)。a=a*b。//正確a=a*2。//可以a=2*a。//出錯(cuò)只能聲明為非成員函數(shù)constplexoperator*(constplexamp。lhs,constplexamp。16
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1