青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

向往的程序人生

C,C++,設(shè)計(jì)模式,3D圖形學(xué),游戲開(kāi)發(fā)
posts - 4, comments - 13, trackbacks - 0, articles - 0

C++編程中的一些感悟

Posted on 2009-04-23 15:44 向往 閱讀(1139) 評(píng)論(4)  編輯 收藏 引用 所屬分類(lèi): C/C++/Script
接觸C++已經(jīng)有五個(gè)年頭了,多多少少在學(xué)習(xí)和工作的過(guò)程中有些感悟,遂一一記錄,勉己勉人.
有少許字段是摘抄自網(wǎng)上的文章,但存檔時(shí)只是隨手黏貼,丟失了作者信息,無(wú)法列出,對(duì)此表示歉意,并感謝發(fā)揚(yáng)分享精神的原作者.
此外,若以后有新的感悟?qū)⒃诖颂砑?有不當(dāng)之處,懇請(qǐng)指正.
  1. 指針賦值時(shí),要謹(jǐn)防指針的同值性.如:
     1 void SharePtr::operator = (Ptr *ptr)
     2 {
     3     if(mPtr != ptr)        // 防止指針同值.其中mPtr是SharePtr類(lèi)中用來(lái)保存指針的變 量.
     4     {
     5         if(mPtr != NULL)
     6         {
     7             delete mPtr;   // 如果不是同值, 刪除之前的指針.
     8             mPtr = ptr;
     9         }
    10     }
    11 

  2. 不要忽視編譯警告,有些警告是出現(xiàn)bug并導(dǎo)致程序crash的征兆。比如類(lèi)型轉(zhuǎn)化警告、數(shù)據(jù)未初始化警告都可能導(dǎo)致程序出錯(cuò)。為了以后減少調(diào)試和避免錯(cuò)誤的幾率,請(qǐng)重視編譯器的警告信息。
  3. 當(dāng)工程需要給Class加導(dǎo)出前綴(如:__declspec(dllexport))卻有些沒(méi)有加時(shí),其他工程引用它將會(huì)出現(xiàn) Unrezosle Symbol的錯(cuò)誤.
  4. 若某個(gè)類(lèi)需要作為父類(lèi),其析構(gòu)函數(shù)必須聲明為virtual,否正子類(lèi)的析構(gòu)函數(shù)無(wú)法調(diào)用,導(dǎo)致內(nèi)存泄漏.
  5. 新增一個(gè)Class時(shí),先定好接口,然后再編碼.這樣可以不用經(jīng)常改動(dòng),減少編譯時(shí)間. 
  6. 要謹(jǐn)防數(shù)值越界.對(duì)于有些存儲(chǔ)范圍小的變量,必須先進(jìn)行越界處理,然后再賦值.如:
    // 未添加數(shù)據(jù)越界檢測(cè)代碼
    int num = -1;
    unsigned 
    char ch = num; // ch的值不是-1,而是255.因?yàn)閚um超出了unsigned char表示的范 圍.

    // 添加了數(shù)據(jù)越界檢測(cè)代碼
    int num = -1;
    assert(num 
    >=0 && num <= std::limit<unsinged char>::max());  // 若越界則彈出斷言
    unsigned char ch = num;
  7. 在宏里邊盡量不定義變量,否則在外部調(diào)用兩次時(shí),有可能出現(xiàn)變量重復(fù)定義的錯(cuò)誤.
    如果確實(shí)要定義變量,可以改寫(xiě)成函數(shù).
  8. 不要為模式而模式.使用設(shè)計(jì)模式只是為了更好地復(fù)用和擴(kuò)展,如果得到反作用,寧愿不用.
  9. 有些子類(lèi)應(yīng)當(dāng)覆蓋抽象類(lèi)vitual成員時(shí),千萬(wàn)不能誤寫(xiě)為重載.否則很難查出錯(cuò)誤.
  10. 若有兩個(gè)人做同一個(gè)模塊時(shí),需要商量好整體架構(gòu),明確分工,不可隨意修改他人的代碼,若要修改也應(yīng)告訴原作者.若對(duì)某些分工意見(jiàn)有分歧時(shí),應(yīng)慢慢磨合,耐心心細(xì)比較,確定可行方案,切不可逃避,將問(wèn)題延續(xù)下去. 
  11. 定義接口時(shí),盡量為使用者(用戶(hù))提供明朗,統(tǒng)一,清晰的接口:
    1) 盡可能使用默認(rèn)參數(shù);
    2) 使用管理器管理物體的創(chuàng)建刪除;
    3) 使用抽象類(lèi)抽象出若干類(lèi)似Object的接口;
    4) 函數(shù)名盡量使用動(dòng)詞或動(dòng)賓結(jié)構(gòu),并體現(xiàn)出職責(zé);
    5) 在實(shí)現(xiàn)相同功能的情況下,對(duì)外提供的函數(shù)應(yīng)盡可能少;
    6) 能聲明成private或protected的數(shù)據(jù)成員和成員函數(shù)就不要聲明為public. 
  12. 每個(gè)對(duì)象應(yīng)當(dāng)完成并且只完成它該做的事,只管它該管的事,簡(jiǎn)而言之,就是對(duì)象內(nèi)部,對(duì)象之間應(yīng)該保持"高內(nèi)聚,低耦合".
  13. 寫(xiě)一個(gè)循環(huán)時(shí),如果該循環(huán)體比較大,則應(yīng)該先寫(xiě)好循環(huán)判斷條件,再實(shí)現(xiàn)細(xì)節(jié).
    while(i > 0)
    {
        
    --i;
    }
    //實(shí)現(xiàn)如上代碼后,再寫(xiě)實(shí)現(xiàn)細(xì)節(jié)(循環(huán)體).這樣做的目的是可以避免在實(shí)現(xiàn)細(xì)節(jié)后忘記增加--i等這類(lèi)循環(huán)因子更新語(yǔ)句.
    如:while(i > 0)
    {
        循環(huán) 體;
        
    --i;
    }
  14. 代碼中的注釋?xiě)?yīng)當(dāng)致力于解釋為什么,而不是怎么做。好的注釋并不是重復(fù)代碼中顯而易見(jiàn)的事實(shí),而是引起對(duì)代碼中微妙的弱點(diǎn)的重 視。明白的代碼常常是被注釋所玷污了,不過(guò)對(duì)于作者顯而易見(jiàn)的東西對(duì)于讀者來(lái)說(shuō)常常是晦澀的。一整段的注釋要比逐行解釋好的多。
  15. 類(lèi)的組織Class organization
    1).按照以下順序組織類(lèi)的定義,按照用戶(hù)最為關(guān)心的順序組織類(lèi)的代碼:
    Public type forward-declarations & typedefs  
    Public constructors & destructor  
    Public member functions
    -----------------------------------------------------------
    Protected type forward-declarations & typedefs  
    Protected member functions  
    -----------------------------------------------------------
    Private type forward-declarations  
    Private member functions  
    Private data members  
    2).盡量不要在類(lèi)的定義體中進(jìn)行函數(shù)定義。模板及內(nèi)聯(lián)函數(shù)除外。
    3).復(fù)用public private protected關(guān)鍵字,將不同類(lèi)型的成員分開(kāi),如成員函數(shù)和數(shù)據(jù)成員。
    4).在繼承類(lèi)里就不要重復(fù)寫(xiě)virtual關(guān)鍵字,可以 將它們的聲明組織成一組。
  16. 在使用new/delete, malloc/free時(shí),注意"誰(shuí)創(chuàng)建誰(shuí)銷(xiāo)毀"的原則.除非有明確的規(guī)約,否則很容易造成內(nèi)存管理混亂,導(dǎo)致出現(xiàn)內(nèi)存錯(cuò)誤.
  17. 頭文件包含其實(shí)是一想很煩瑣的工作,不但我們看著累,編譯器編譯的時(shí)候也很累,再加上頭文件中常常出現(xiàn)的宏定義。感覺(jué)各種宏定 義的展開(kāi)是非常耗時(shí)間的,遠(yuǎn)不如自定義函數(shù)來(lái)得速度。我僅就不同頭文件、源文件間的句則結(jié)構(gòu)問(wèn)題提出兩點(diǎn)原則,僅供參考:
    第一個(gè)原則 應(yīng)該是,如果可以不包含頭文件,那就不要包含了。這時(shí)候前置聲明可以解決問(wèn)題。如果使用的僅僅是一個(gè)類(lèi)的指針,沒(méi)有使用這個(gè)類(lèi)的具體對(duì)象(非指針),也沒(méi) 有訪問(wèn)到類(lèi)的具體成員,那么前置聲明就可以了。因?yàn)橹羔樳@一數(shù)據(jù)類(lèi)型的大小是特定的,編譯器可以獲知。
    第二個(gè)原則應(yīng)該是,盡量在 CPP文件中包含頭文件,而非在頭文件中。假設(shè)類(lèi)A的一個(gè)成員是是一個(gè)指向類(lèi)B的指針,在類(lèi)A的頭文件中使用了類(lèi)B的前置聲明并便宜成功,那么在A的實(shí)現(xiàn) 中我們需要訪問(wèn)B的具體成員,因此需要包含頭文件,那么我們應(yīng)該在類(lèi)A的實(shí)現(xiàn)部分(CPP文件)包含類(lèi)B的頭文件而非聲明部分(H文件)。
  18. 解決頭文件相互包含問(wèn)題的方法之一:在.h文件里用class A聲明,數(shù)據(jù)成員用指針或者引用,在.cpp里用#include"A.h"即可.
  19. 在索引列表時(shí),最好能根據(jù)索引和名字來(lái)獲取元素,以滿(mǎn)足不同場(chǎng)合的需求.在編輯器制作中更彰顯其意義.
  20. 在類(lèi)A的構(gòu)造函數(shù)里如果有類(lèi)B成員變量b,并調(diào)用了b的某個(gè)函數(shù)如b.fun(),則b.fun()里邊不能調(diào)用A的指針.因 為此時(shí)A的指針尚未完成空間分配,強(qiáng)行調(diào)用將導(dǎo)致出錯(cuò).
    這種情況在Debug下偶爾出錯(cuò),但在Release版下一定出錯(cuò).應(yīng)當(dāng)引起 重視!
  21. 以二進(jìn)制存儲(chǔ)信息時(shí),要注意int等類(lèi)型在不同的平臺(tái)不同CPU架構(gòu)下長(zhǎng)度是不一樣的,故在寫(xiě)入文件時(shí),建議先用宏 (如#define INT_LENGTH 4)來(lái)表示寫(xiě)進(jìn)文件的長(zhǎng)度.此外,還要注意字節(jié)序(高位在前還是低位在前)的問(wèn)題.
    所以一般情況下,用文本文件來(lái)存儲(chǔ)相關(guān)信息,避免 了那些問(wèn)題.
  22. 由于std::vector里邊的內(nèi)存管理機(jī)制會(huì)適時(shí)釋放內(nèi)存以調(diào)整合適的大小,故在外部不要保存std::vector里的 元素地址.如果確實(shí)要保存,則每次增刪vector元素時(shí)必須更新外部的指針,否則將可能造成垃圾指針而出現(xiàn)內(nèi)存錯(cuò)誤(有時(shí)候甚至不報(bào)錯(cuò),程序運(yùn)行出現(xiàn)不 可預(yù)料的結(jié)果.很詭異,很難發(fā)現(xiàn)bug).
  23. 永遠(yuǎn)不要在類(lèi)的構(gòu)造或者析構(gòu)過(guò)程中調(diào)用虛函數(shù),因?yàn)檫@樣的調(diào)用永遠(yuǎn)不會(huì)沿類(lèi)繼承樹(shù)往下傳遞到子類(lèi)中去。否則很有可能出現(xiàn)很隱晦 的bug.參見(jiàn):http://www.enet.com.cn/article/2005/0706/A20050706431501_2.shtml
  24. 給有虛函數(shù)的模板類(lèi)添加父類(lèi).即將公用接口抽象在父類(lèi)里,就可以統(tǒng)一處理模板類(lèi)了.

Feedback

# re: C++編程中的一些感悟  回復(fù)  更多評(píng)論   

2009-04-23 18:22 by Sunshine Alike
好文!學(xué)習(xí)了~~

# re: C++編程中的一些感悟  回復(fù)  更多評(píng)論   

2009-04-24 01:31 by sisco
感覺(jué)像大雜燴,不過(guò)有些條目精辟入里.謝謝!

# re: C++編程中的一些感悟  回復(fù)  更多評(píng)論   

2009-04-24 11:28 by 向往
@Sunshine Alike
@sisco
如果本文對(duì)大家有所幫助,是我寫(xiě)文章的初衷和動(dòng)力.謝謝賞閱.

# re: C++編程中的一些感悟  回復(fù)  更多評(píng)論   

2009-08-21 22:43 by 李現(xiàn)民
第六條,比較好

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久国产精品麻豆ai换脸| 国产偷久久久精品专区| 亚洲高清影视| 亚洲激情偷拍| 亚洲一级在线观看| 亚洲大片在线| 欧美国产视频在线观看| 国产一区在线播放| 欧美91视频| 经典三级久久| 久久久久国产一区二区| 亚洲丰满在线| 久久国产精品久久久久久| 午夜在线观看免费一区| 久久精品亚洲精品| 欧美激情精品久久久久| 国产精品萝li| 一区二区三区四区蜜桃| 国产在线拍揄自揄视频不卡99| 欧美91大片| 麻豆精品网站| 欧美成人一品| 欧美日韩国产综合久久| 国产精品一区一区三区| 激情久久综艺| 99av国产精品欲麻豆| 亚洲免费在线精品一区| 久久中文在线| 亚洲靠逼com| 亚洲欧美日韩国产一区二区| 久久综合久久久| 国产精品―色哟哟| 亚洲国产精品久久久久秋霞蜜臀| 中日韩美女免费视频网站在线观看| 久久国产日韩欧美| 日韩亚洲国产欧美| 欧美专区在线播放| 欧美精品在线播放| 国产亚洲精品自拍| 久久久精品国产免费观看同学| 欧美精品www| 国产在线观看精品一区二区三区| 亚洲精品中文字幕女同| 久久精品在线播放| 亚洲午夜国产一区99re久久| 免费一区视频| 韩国福利一区| 欧美亚洲视频| 亚洲视频在线视频| 欧美精品系列| 亚洲国产精品视频一区| 亚洲午夜av在线| 欧美成人免费网| 欧美一区二区三区免费视| 亚洲资源av| 亚洲一二三区视频在线观看| 亚洲亚洲精品三区日韩精品在线视频| 国产午夜精品久久| 欧美 日韩 国产一区二区在线视频| 蜜桃久久av| 欧美一区二区播放| 蜜臀99久久精品久久久久久软件| 日韩一二三在线视频播| 香蕉成人久久| a4yy欧美一区二区三区| 欧美精品一区在线发布| av不卡免费看| 国产精品美女久久久久av超清| 亚洲国产欧美日韩精品| 猛干欧美女孩| 久久亚洲综合色一区二区三区| 黄色在线一区| 欧美成人午夜剧场免费观看| 免费在线观看一区二区| 日韩一级免费观看| 在线一区二区三区四区五区| 国产精品久久久久影院亚瑟| 午夜影视日本亚洲欧洲精品| 欧美在线免费观看| 亚洲国产日韩欧美综合久久 | 欧美理论电影网| 一本综合久久| 亚洲一区图片| 伊人夜夜躁av伊人久久| 亚洲高清久久| 欧美色中文字幕| 久久国产精品一区二区三区| 欧美综合国产| 日韩天天综合| 性欧美激情精品| 亚洲精品中文在线| 亚洲自拍偷拍福利| 亚洲国产精品一区二区第四页av| 亚洲精品九九| 国产亚洲制服色| 亚洲精品乱码久久久久久日本蜜臀| 国产精品大片免费观看| 免费观看久久久4p| 欧美深夜福利| 老司机午夜精品视频在线观看| 欧美激情国产精品| 久久aⅴ国产欧美74aaa| 欧美xx69| 久久久久久久久伊人| 欧美日韩国产影院| 欧美大片在线观看一区| 国产精品女主播| 亚洲国产天堂久久综合| 亚洲精品日日夜夜| 国产欧美亚洲日本| 亚洲娇小video精品| 国产性色一区二区| 一本到12不卡视频在线dvd| 亚洲国产欧美在线 | 国产亚洲精久久久久久| 亚洲激情小视频| 国产亚洲综合精品| 日韩亚洲成人av在线| 国产伦精品一区二区三区照片91 | 女女同性女同一区二区三区91| 最新亚洲一区| 久久福利电影| 亚洲国产小视频| 欧美一区成人| 午夜精品久久久久99热蜜桃导演| 久久精品72免费观看| 亚洲欧美久久久| 欧美激情第3页| 欧美jizz19hd性欧美| 久久久蜜臀国产一区二区| 欧美91视频| 久久蜜桃香蕉精品一区二区三区| 欧美日韩一本到| 蜜桃久久精品乱码一区二区| 国产亚洲一区二区三区在线播放| 亚洲美女毛片| 中文成人激情娱乐网| 亚洲美女黄色| 亚洲激情女人| 欧美电影专区| 免费日韩一区二区| 国产专区精品视频| 亚洲午夜精品一区二区三区他趣| 一区二区三欧美| 久久中文精品| 欧美成人影音| 欧美日韩在线播放三区| 亚洲精品自在久久| 亚洲永久网站| 欧美日韩亚洲不卡| 在线一区欧美| 亚洲午夜羞羞片| 国产精品欧美一区喷水| 亚洲精品在线一区二区| 一区二区三区视频免费在线观看| 久久亚洲国产精品一区二区 | 在线综合亚洲| 欧美一级视频精品观看| 国产欧美亚洲一区| 欧美一区二区三区日韩视频| 久久成人18免费观看| 欧美一区二区三区男人的天堂 | 欧美一区午夜精品| 国产精品爱啪在线线免费观看| 欧美成人一区二区| 欧美性开放视频| 亚洲永久精品大片| 亚洲欧美国产77777| 国产精品有限公司| 亚洲一区三区视频在线观看 | 亚洲美女区一区| 国产精品高潮呻吟久久| 亚洲精品国产精品国自产观看浪潮| 欧美激情第六页| 国产乱人伦精品一区二区| 香蕉久久国产| 久久蜜桃精品| 亚洲激情av在线| 欧美人成在线视频| 亚洲少妇自拍| 久久九九热re6这里有精品| 免费成人黄色av| 亚洲一二三四区| 欧美午夜在线一二页| 久久爱www久久做| 亚洲国产综合视频在线观看| 欧美日韩大片| 亚洲欧美电影在线观看| 黄色在线成人| 欧美成人精品激情在线观看| 亚洲少妇自拍| 欧美午夜精品理论片a级按摩 | 欧美一级理论片| 亚洲久久在线| 女人色偷偷aa久久天堂| 亚洲一区二区免费看| 国产一区二区高清不卡| 欧美电影在线播放| 久久久久久久综合日本| 亚洲国产精品久久人人爱蜜臀|