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

正文內(nèi)容

改善程序設(shè)計(jì)技術(shù)的50個(gè)有效做法-資料下載頁

2025-01-07 15:45本頁面
  

【正文】 e h=getHandle( )。//錯(cuò)誤 …… } void f3( ) { cout sdm:: BOOK_VERSION。//沒問題只用一次 double d=BOOK_VERSION。//錯(cuò)誤 Handle h=getHandle( )。//錯(cuò)誤 …… } 兩個(gè) namespace中有相同的名字,只要標(biāo)明namespace域名即可區(qū)分。 using namespace stm。 using namespace sdm。 stm:。BOOK_VERSION。 sdm::BOOK_VERSION。 類與函數(shù)的實(shí)現(xiàn) 29.避免傳回內(nèi)部數(shù)據(jù)的 handles class String{public: String(const char *value)。 ~String( )。 operator char *( ) const。 private: char * data。}。 inline String::operator char *( )const { return data。 }//潛伏著危險(xiǎn) const String B(“I love you!”)。 char * str = B。//str 與 strcpy(str, “I love you?”)。//改變 str, 也就改變了 字符串常量 B 被改變。 去掉 operator char*( )const。中 const , 可以令常量 B不能調(diào)用 operator char *( )。 但 String 便不能轉(zhuǎn)換成 char*. 安全的做法是: inline String::operator char *( )const { char* copy = new char[strlen(data)+1]。 strcpy(copy, data)。 return copy。 } 這個(gè)函數(shù)比較慢,可能產(chǎn)生內(nèi)存丟失。 class String{ public: String(const char *value)。 ~String( )。 operator const char *( ) const。 private: char * data。 }。 inline String::operator const char *( )const { return data。 }//又快又安全 傳回一個(gè)常量指針,不可改變。 引用也可能發(fā)生傳回內(nèi)部數(shù)據(jù)的 handle問題。 class String{ public: …… charamp。 operator[ ](int index)const {return data[index]。} private: char *data。 }。 String s= “I am not const”。 s[0]= ?x?。 const String cs = “I am const”。 cs[0] = ?x?。 //改變了常字符串,編譯器沒發(fā)現(xiàn) 問題出在 const 函數(shù)返回值是引用。 即使不是 const 函數(shù),“傳回 handles”也是有問題的。 //隨機(jī)選擇一個(gè)作家的名字 String someFamousAuthor( ) { switch( rand( )%3){ //隨機(jī)函數(shù) case 0: return “Margaret Mitchell”。 //《 飄 》 的作者 case 1: return “Stephen King”。 //著名通俗小說家 case 3: return “Scott Meyers” //本書作者 } return “ ”。 } 這個(gè)函數(shù)的返回值是一個(gè)局部指針handle,函數(shù)用畢被銷毀 因此返回值將是無定義的內(nèi)存(dangling pointer)。 盡可能避免讓一個(gè)函數(shù)傳回 dangling handles,可以提高程序的可靠性。 30. 避免寫出成員函數(shù)返回一個(gè) nonconst pointer或 reference(引用 ) 并以之指向較低存取層級(jí)的成員 class Address{……} ; class Person{ public: addressamp。 personAddress( ){return address。} …… private: Address address。 //私有數(shù)據(jù)成員 …… }; Person scott(……)。 Addressamp。 addr=( )。 //全局對(duì)象 addr與 同一地址 私有成員公開化,可以從外部改變私有數(shù)據(jù)的值。 變成指針也有同樣的問題。 31.千萬不要返回“函數(shù)內(nèi)局部對(duì)象的 reference”或“函數(shù)內(nèi)以 new獲得的指針?biāo)傅膶?duì)象” “傳回一個(gè)引用( reference),指向局部對(duì)象”,函數(shù)用畢返回時(shí),局部對(duì)象被析構(gòu),變成引用一個(gè)不存在的對(duì)象。 const plexamp。 operator*(const plexamp。 lhs,const plexamp。 rhs) {plex temp(**, *+*)。 return temp。 } 錯(cuò)誤。返回值地址指向局部對(duì)象,與局部對(duì)象同名,運(yùn)算執(zhí)行完畢,局部對(duì)象被析構(gòu),返回值指向一個(gè)不存在的地址。 class Address{……} ; class Person{ public: addressamp。 personAddress( ){return address。} …… private: Address address。 //私有數(shù)據(jù)成員 …… }; Person scott(……)。 Addressamp。 addrPtr=( )。 //指針 addr指向 同一地址 只要把函數(shù)返回值改成 const類型即可避免外部修改。 class Address{……} ; class Person{ public: address* personAddress( ){return address。} …… private: Address address。 //私有數(shù)據(jù)成員 …… }; Person scott(……)。 Address* addrPtr=( )。 //指針 addr指向 同一地址 同樣問題 只要把函數(shù)返回值改成 const類型即可避免外部修改。 32. 盡可能延緩變量定義式的出現(xiàn) //這個(gè)函數(shù)太早定義變量 encrypted string encryptPassward(const stringamp。 passward) { string encrypted。 if ( ( ) MINIMUM_PASSWARD_LENGTH) {throw logic_error(“Passward is too short”)。 …… return encrypted。 } 一旦有異常拋出, encrypted定義就是多余的。 盡量在變量定義時(shí)初始化。 33. 明智地運(yùn)用 inline inline內(nèi)聯(lián)函數(shù)提高效率,編譯時(shí)實(shí)現(xiàn)最佳化。但是增加 object目標(biāo)代碼,加大內(nèi)存開銷。 太多的 inline函數(shù),會(huì)減低取出指令的速度( instruction fetch) 編譯器會(huì)因某些理由自動(dòng)拒絕 inline函數(shù),將它當(dāng)成非 inline函數(shù)。這時(shí)系統(tǒng)發(fā)出一個(gè)警告。比如太長(zhǎng)的函數(shù), virtual函數(shù),不適合 inline的函數(shù)。 構(gòu)造函數(shù)看起來不長(zhǎng),有時(shí)繼承派生類中的構(gòu)造函數(shù),比看起來的要長(zhǎng)。 比如基類的構(gòu)造函數(shù), new的使用,都使inline失效。 inline函數(shù)不會(huì)自動(dòng)升級(jí),程序一旦被改動(dòng)就要重新編譯。 inline 函數(shù)應(yīng)限制用于一些非常平凡的,占有重要效率地位的函數(shù)。 慎重使用 inline函數(shù),便于日后除錯(cuò)。 34. 將文件之間的編譯關(guān)系降到最低 一個(gè) class 在文件 file中定義并實(shí)現(xiàn)。程序用到這個(gè)類的對(duì)象就要連接文件 file include file文件就與程序發(fā)生依賴關(guān)系。修改 file文件,會(huì)引起全程序重編譯。 C++一個(gè) class B中,用到另一 class A的對(duì)象, A必須先完全定義并實(shí)現(xiàn)。 如果 A寫在文件 file里, A的任何改變都會(huì)引起整個(gè)程序重新編譯。 改進(jìn) 的方法是 A中盡量使用指向 B類對(duì)象的指針或引用 。這樣, B只要先聲明, A的編譯不依賴于 B. file改變時(shí), A不需要重新編譯。 A 稱為 Handle class 另一種方法是用抽象類做基類,成為 Protocol class。Protocol class 沒有任何實(shí)現(xiàn)。其作用只是一個(gè)接口。 如果引用或指針能夠完成任務(wù),就不用對(duì)象。 如果可能, 以 class的聲明,代替 class的實(shí)現(xiàn)。 盡可能只把 class的聲明放在頭文件里,其余實(shí)現(xiàn)放在由客戶完成的文件里,不參與編譯。 頭文件盡量不 include別的頭文件,除非不聯(lián)不行。 繼承關(guān)系與面向?qū)ο笤O(shè)計(jì) 繼承體系是 C++與 C的更本區(qū)別。 如果需要一群 class,擁有許多共享性質(zhì),那就要考慮用基類還是模板。 如果 class A是根據(jù) class B實(shí)現(xiàn),考慮 A中應(yīng)該有一個(gè) B類對(duì)象還是 A繼承 B. 如果需要設(shè)計(jì)一個(gè)安全類型,通用,而 C++標(biāo)準(zhǔn)庫未定義,那么應(yīng)該使用模板還是以泛型 void*指針來實(shí)現(xiàn)? “說出你的意思,并了解你所說的每一句話?!? 35.公有繼承, “ isa”的關(guān)系 請(qǐng)牢記: 公有繼承 public inheritance是一種 isa的關(guān)系。 如果 class D 公有繼承 class B, 則 D是 B的 subclass子類。 D的對(duì)象是 B的對(duì)象 , 反之不成立。 B比 D更一般化, D比 B更特殊化??梢杂?B對(duì)象的地方, D的對(duì)象也可以用。要用 D對(duì)象的地方, B對(duì)象無法效勞。 每一匹白馬都是馬,每一匹馬不一定是白馬。公孫策“白馬非馬”,白馬是馬的真子集,而不相等。馬是基類,白馬是派生類。 C++的繼承關(guān)系,不同于日常生活,也不同于數(shù)學(xué)。 鳥 bird會(huì)飛。 企鵝 penguin是鳥,可企鵝不會(huì)飛。如果鳥class中有 fly,則企鵝不是鳥的派生類。 長(zhǎng)方形 ?正方形?還是 正方形 ?長(zhǎng)方形??jī)烧叨疾粚?duì)。 另外定義一個(gè)基類, 長(zhǎng)方形和正方形都是它的派生類。 36.區(qū)分接口繼承( interface inheritance)和實(shí)現(xiàn)繼承( implementation inheritance) 成員函數(shù)的接口總是會(huì)被繼承 聲明純虛函數(shù)是為了讓導(dǎo)出類只繼承其接口。 純虛函數(shù)也可以定義,即可以提供其實(shí)現(xiàn)代碼。只有一種方法調(diào)用就是寫明 class域名 . 聲明一般虛函數(shù)(非純)是為了讓導(dǎo)出類只繼承其接口和缺省行為。 聲明非虛擬函數(shù)是為了讓導(dǎo)出類只繼其接口及其實(shí)現(xiàn)。 繼承類中行為不變的函數(shù)不應(yīng)聲名為虛函數(shù)。 37. 絕對(duì)不要重新定義繼承而來的非虛函數(shù) 如果基類中定義了一個(gè)非虛函數(shù),派生類同時(shí)繼承其接口和實(shí)現(xiàn)。派生類的對(duì)象可直接調(diào)用基類的這個(gè)函數(shù),行為不變。 如果派生類中重新定義繼承而來的非虛函數(shù),基類中的函數(shù)將被覆蓋。函數(shù)調(diào)用將發(fā)生變化。這就是說本應(yīng)該定以為虛函數(shù)。 如果不希望函數(shù)行為有變化,則不應(yīng)該重定義非虛函數(shù)。 38.絕對(duì)不要重新定義繼承而來的缺省參數(shù)值 虛函數(shù)的調(diào)用由實(shí)際引入的參數(shù)對(duì)象確定。動(dòng)態(tài)綁定,后聯(lián)編。 但如果函數(shù)有缺省值,缺省值則是靜態(tài)綁定。調(diào)用一個(gè)有缺省值的虛函數(shù), 非缺省參數(shù)的派生類型實(shí)參確定調(diào)用哪一個(gè)函數(shù),但缺省參數(shù)依然用基類的值。 重新定義的缺省參數(shù)并不起任何作用,反而引起混淆。 要么不定義虛函數(shù)參數(shù)的缺省值,有了缺省值就不可以重定義。 39.避免在繼承中做向下轉(zhuǎn)型( castdown)動(dòng)作 class Person{……} ; class BankAccount { BankAccount(const Person* primaryOwner, const Person *jointOwner)。 virtual ~BankAccount( )。 virtual void makeDepoisit(double amount)=0。
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1