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

正文內容

c改善程序設計技術的50個有效做法(編輯修改稿)

2025-02-07 04:16 本頁面
 

【文章內容簡介】 ool memPool。 //Airplane的 memory pool }。 inline void Airline::operator new(size_t size) { return (size)。 } inline void Airline::operator delete(void* p, size_t size) {(p, size)。 } 為 Airplane 的 memPool初始化, 要放在Airplane 類實現(xiàn)的文件里 Pool Airplane::memPool(sizeof(Airplane))。 構造函數(shù)、析構函數(shù)和賦值運算符 構造函數(shù)、析構函數(shù)和賦值運算用來產生一個新對象并初始化,撤銷一個對象并收回占有的內存,為已有的對象賦一個新值。 不能有錯,必須將他們徹底搞清楚。 11. class內有成員指針并動態(tài)配置內存時,一定要有拷貝構造函數(shù),賦值運算符重載 class String { public: String(const char*value)。 ~String( )。 …… //沒有拷貝構造函數(shù), //也沒有賦值運算符重載 private: char*data。 }。 String::String(const char *value) { if(value) { data = new char[strlen(value)+1]。 strcopy(data, value)。 } else { data = new char[1]。 *data = “\0”。 } } inline String::~String( ){delete[ ] data。} String a( “Hello” )。 String b(“World” )。 b = a。 Hello World a b data data 由于沒有自定義的賦值函數(shù),只能用 C++產生的默認賦值函數(shù), 它簡單地將 b的成員指針 data指向 ,引起 字符串“ World”占有的內存遺失。 而且 ,其中一個被析構時另一個就丟失了。 拷貝構造函數(shù)用來傳值, void donothing(String la){ } String s= “the truth is out of there”。 donothing(s)。 當函數(shù) donothing完成任務后,參數(shù) s所含的指針被析構, la被刪除。 即便 la不再使用,將來又一次析構 la會造成問題。 解決的辦法就是自己定義拷貝構造函數(shù),賦值函數(shù)重載。 如果確信永不使用這些函數(shù),把他們定義為私有函數(shù),而且不實現(xiàn)。 一旦出錯,編譯器會給出錯誤提示。 12構造函數(shù)中盡量以初始化代替賦值 一個類中的 const成員數(shù)據(jù)和 reference引用數(shù)據(jù)只能被初始化,不能被賦值。 即便沒有 const成員數(shù)據(jù)和 reference引用數(shù)據(jù),初始化也比賦值效率高。 構造函數(shù)分兩個階段實現(xiàn): 1. 數(shù)據(jù)成員初始化。 2. 調用構造函數(shù)。 數(shù)據(jù)成員賦值要調用構造函數(shù),再調用賦值函數(shù),做兩次調用影響效率。 初始化也容易維護,修改。 有一種例外: 一個類內有大量數(shù)據(jù)成員時,賦值比初始化效率高。 class ManyDataMbs { public: ManyDataMbs() ManyDataMbs( const ManyDataMbsamp。 x) 。 private: int a, b, c, d, e, f, g, h。 double i, j, k, l, m。 void init ( )。//用來將數(shù)據(jù)成員初始化,不做他用 }。 void ManyDataMbs::init( ) { a=b=c=d=e=f=g=h=1。 i=j=k=l=m=0。 } ManyDataMbs::ManyDataMbs( ) { init( )。 …… } ManyDataMbs:: ManyDataMbs(const ManyDataMbsamp。 x) { init( )。 …… } 靜態(tài)數(shù)據(jù)成員 static class member不應該在構造函數(shù)中初始化。 靜態(tài)數(shù)據(jù)成員只能初始化一次,不能初始化多次。 12. 數(shù)據(jù)成員初始化的次序應該和類內聲明的次序相同 templateclass T class Array //有上下界的數(shù)組 { public: Array(int lowBound, int highBound)。 …… private: vectorT data。 //數(shù)組數(shù)據(jù)存儲于一個 vector對象 data中 size_t size。 //數(shù)組中元素的個數(shù) int lBound, hBound。 //上下界 }; templateclass T ArrayT::Array(int lowBound, int highBound) : size(highBoundlowBound+1), lBound(lowBound), hBound(highBound), data(size) { } 實際初始化中, data先被初始化,然后 size, lBound, hBound. 這樣數(shù)組中,究竟有多少個元素無法確定。 基類成員總是比導出類先初始化。多重繼承時初始化的先后次序要十分小心。 14. 總是讓基類擁有虛析構函數(shù) 一個軍事應用軟件 class EnemyTarget { public: EnemyTarget( ){++ numTargets。} EnemyTarget(const EnemyTargetamp。) {++ numTargets。} ~ EnemyTarget( ){ numTargets。} static size_t numberOfTargets( ) {return numTargets。} virtual bool destroy( )。 //摧毀敵方目標是否成功 private: static size_t numTargets。 //對象計數(shù)器 }; size_t EnemyTarget::numTargets。 //靜態(tài)成員初始化為 0,放在類外 class EnemyTank : public EnemyTarget { public: EnemyTank ( ){++ numTanks。} EnemyTank (const EnemyTankamp。){++ numTanks。} ~ EnemyTank ( ){ numTanks。} static size_t numberOfTanks( ){return numTanks。} virtual bool destroy( )。 //摧毀敵方坦克是否成功 private: static size_t numTanks。 //敵方坦克計數(shù)器 }; EnemyTarget *targetPtr = new EnemyTank。 …… delete targetPtr。 //未定義,計數(shù)出錯,影響戰(zhàn)斗勝敗 解決辦法,把 EnemyTarget類中的析構函數(shù)定義為 virtual即可。 幾乎所有的基類都有虛函數(shù),只要有一個虛函數(shù),就要把析構函數(shù)定義為虛函數(shù)。 沒有虛函數(shù)的類,有繼承派生類對象析構,也要定義虛析構函數(shù)。 但虛函數(shù)會增加內存開銷。完全不必要時不要用虛析構函數(shù)。 聲明一個抽象類,可以加一個純虛析構函數(shù)。 15. 讓 operator=返回 *this的引用 reference C語言中 operator= 的原型 Camp。 C::operator=(const Camp。)。 char x, y, z。 x=y=z= ?a?。 x,operator=(=(= ?a?))。 =的返回值是 =的實參。他們應該有相同的類型。 但不要讓 operator=返回 void類型, const類型 Strinamp。 String::operator=(const Stringamp。 rhs) { …… return *this。 //返回一個引用指向左側對象 } Strinamp。 String::operator=(const Stringamp。 rhs) { …… return rhs。 //返回一個引用指向右側對象,錯誤 } 后一個返回值,編譯器無法編譯,無法返回 const類型 . 如果參數(shù)中去掉 const變成: Strinamp。 String::operator=( Stringamp。 rhs); X= ?a?。 //無法編譯 rhs應該是一個變量。 結論:必須返回 *this。 16. 在 operator=中為所有的數(shù)據(jù)成員賦值 基類中這不成問題,在派生類中要小心。 正確的賦值運算 Derivedamp。 Derived::operator=(const Drivedamp。 rhs) { if(this = = amp。rhs) return *this。 Base::operator=(rhs)。 //調用基類的賦值運算 data = 。 return *this。 } Derivedamp。 Derived::operator=(const Drivedamp。 rhs) { if(this = = amp。rhs) return *this。 static_castBaseamp。(*this) = rhs。 //*this強制轉換成基類的引用賦值基類成員 data = 。 return *this。 } 拷貝構造函數(shù)中要調用基類構造函數(shù)。 用第一種方法 在 operator=中檢查是否“自己賦值給自己” class X{……}。 X a。 Xamp。b = a。//b是 a的別名 (aliasing) a = b。 //自己賦值給自己 合法 在賦值函數(shù)中要特別謹慎的處理自己的別名賦值給自己的問題。 提高效率 先做檢查,一發(fā)現(xiàn)自己賦值給自己立即返回。導出類的賦值運算重載中一定要先檢查,可以節(jié)省許多工作 確保正確性 賦值運算通常要先將左邊對象的資源釋放,再行賦值。如果有自己賦值給自己的現(xiàn)象,這個資源可能丟失,不可挽回了。 如何判斷兩個對象是同一個對象? 不是對象的內容相同,而是看他們的地址是否相同。 Xamp。 X::operator=(const Xamp。 rhs) { if(this==amp。rhs) return *this。 …… } aliasing問題不限于賦值運算內,只要用到指針或引用,就可能出現(xiàn)。這時我們就要當心,不要誤刪了有用的資源。 類和函數(shù)的設計和申明 設計一個高效率的類型( class 型別), 必須先回答下列問題 對象如何產生和銷毀? 確定構造函數(shù)和析構函數(shù)的設計。 對象的初始化和賦值有什么不同? 決定構造函數(shù)和賦值函數(shù)的設計。 對象如何傳值 決定拷貝構造函數(shù)的設計 確定合法的范圍 成員數(shù)據(jù)的定義域 確定做什么檢查,何時拋出異常 判斷是否能從已有的類繼承 如果能繼承,注意受基類哪些約束,哪些要用虛函數(shù)。 允許那種類型轉換 構造函數(shù)可以用作隱式類型轉換,顯式類型轉換要自定義。 新類型需要哪些運算和函數(shù) 確定 class的接口。 哪些運算和函數(shù)必須禁用 放到 private成員中。 新類型的對象可調用哪些函數(shù) 確定公有成員函數(shù),保護成員函數(shù), 私有成員函數(shù)。 是否通用類型 確定是否要用類模板 18.努力讓接口完滿( plete)且最小化 客戶端接口 ( client interface)指公有成員,一般只有公有函數(shù),不要有公有數(shù)據(jù)。 完滿接口 允許客戶做合理要求的任意事情。 最小化接口 盡量讓函數(shù)個數(shù)最少。不能有功能重疊的函數(shù)。太多函數(shù)不容易被理解,不易維護,浪費資源。 如果增加一個函數(shù),使新類型更方便使用,就可以增加。
點擊復制文檔內容
醫(yī)療健康相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1