1.struct成員默認訪問方式是public,而 class默認訪問方式是private漏益!
2.exit函數(shù)終止程序執(zhí)行會調(diào)用析構(gòu)函數(shù) ,abort函數(shù)終止程序不會調(diào)用析構(gòu)函數(shù)!
3.靜態(tài)局部變量直到程序終止時才退出井氢!
4.通過public 函數(shù)返回 private成員的引用有可能會破壞類的封裝 ,造成外部變量可以改變類私有成員值得封!
5.常量對象只能調(diào)用常量成員函數(shù),常量成員函數(shù)可以有非常量版本重載峡碉!
6.常量數(shù)據(jù)成員只能在定義時初始化或者在構(gòu)造函數(shù)里用成員初始化值來初始化 ,不能用賦值語句來初始化葛虐!
7.要在析構(gòu)函數(shù)里面使用delete來釋放使用 new申請的內(nèi)存空間!
8.編寫析構(gòu)函數(shù)來釋放類中成員所申請的內(nèi)存空間和使用深拷貝函數(shù)是好的編程習(xí)慣译株!
9.operator++()是相當(dāng)與++d,operator++(int) 是相當(dāng)于 d++ 瓜喇!
10.如果父類中函數(shù)是虛擬函數(shù) ,那么在每個子類中顯式聲明虛擬函數(shù)是好的編程習(xí)慣!
11.如果類作為基類,其析構(gòu)函數(shù)要聲明為虛析構(gòu)函數(shù) ,這樣派生類才可以調(diào)用自己的析構(gòu)函數(shù)歉糜!
12.一個new 就對應(yīng)一個 delete是好的編程習(xí)慣乘寒!
13.istream輸入read 是從文件中讀取 ,ostream輸出write 是寫到文件中去!
14.istream是seekg 重置文件指針位置 ,ostream是seekp, 文件用file.eof()來判斷是否讀取到文件尾部现恼!
15.assert(條件), 當(dāng)滿足條件時就不 assert,不滿足條件才會assert肃续!
16.對于不需要修改的變量,使用常量引用來傳遞參數(shù)可以既保證安全性又保證效率黍檩!
17.在循環(huán)之前調(diào)用srand(time(0)),然后在循環(huán)中調(diào)用 rand()函數(shù)可以使得每次隨機的結(jié)果都不相同!
18.一維數(shù)組形參如下:int a[],二維數(shù)組形參如下 :int a[][SIZE],第一個[] 是空的,后面必須非空始锚!
19.#define A 10 后面沒有分號刽酱!
20.在局部函數(shù)中用new創(chuàng)建的變量是存在內(nèi)存中的,即便局部函數(shù)執(zhí)行完畢內(nèi)存變量仍然存在瞧捌,但是指向它的指針有可能是局部變量棵里,則需要在局部函數(shù)結(jié)束前調(diào)用 delete釋放內(nèi)存空間,以免內(nèi)存泄漏
21.數(shù)組聲明最好用 T *a 來聲明 ,這樣不容易出錯,創(chuàng)建對象最好用 new 而不是直接創(chuàng)建姐呐!
22.定義一個類時殿怜,析構(gòu)函數(shù)(釋放資源)和拷貝構(gòu)造函數(shù)(深拷貝)最好顯示定義!
23.C/C++語言輸入結(jié)束符是ctrl+z(windows下 )曙砂!
24.C語言的printf(“%.9lf”,a); 比c++的 setprecision(10)來的更加精確头谜,C++有時自動舍入精度!
25.理清狀況鸠澈,邏輯嚴(yán)謹柱告,變量初始化、是還是否笑陈、邊界判斷判斷正確际度!
26.要使得棧中的基本元素是模板類類型,必須要定義模板類的一些函數(shù):默認構(gòu)造函數(shù)涵妥,友員輸出函數(shù)等乖菱!
27.用單件模式和全局函數(shù)替代全局變量,以便于拓展和維護蓬网!
28.用const char ptr 表示ptr指向的變量為常量窒所。 char const ptr表明ptr 本身為常量是好的編程習(xí)慣!
29.const int *i = &a, 只是代表不能通過 i指針來修改帆锋,但是可以通過其它途徑來修改 a,例如a=3 墩新!
30.靈活熟練運用語言,如 (a<b?a:b<c?b:c) = val();這句話就將3 個if語句合并成一句話!
31.橋接模式bridge 可以實現(xiàn)接口與實現(xiàn)分離 ,這樣可以減少修改類時需要修改的類的范圍窟坐!
32.優(yōu)先級:i++ 高于 ++i ,注意绵疲,具體運算符優(yōu)先級看下面的運算符優(yōu)先級表哲鸳!
33.遞歸算法符合大致算法思想就行了 ,不必深究思考,合理就可以了!
34.在C++ 中使用0來對指針初始化可以保證數(shù)字字面常量 0可以轉(zhuǎn)換成任何一種指針類型對應(yīng)的空指針盔憨!
35.非const 對象可以調(diào)用 const和非const 函數(shù)徙菠,但是 const對象只能調(diào)用const函數(shù)!
36.可以使用非const 類型變量賦給 const類型參數(shù)郁岩,不能用const類型變量賦值給非 const類型參數(shù)婿奔!
37.類重載二元運算符時缺狠,要么作為類的只帶一個參數(shù)的內(nèi)部函數(shù) ,要么作為類中帶兩個參數(shù)的友元函數(shù)!
38.內(nèi)建的operator-> 是二元的 ,而重載的operator-> 是一元的 ,如果重載了operator-> 則先調(diào)用重載的 ,直到重復(fù)調(diào)用到內(nèi)建的operator->才終止萍摊!
39.盡量使用STL 是好的編程習(xí)慣挤茄!
40.++i返回的是內(nèi)存變量,可以作為左值也可以作為右值 ,而i++ 返回的是字面量 ,不占內(nèi)存, 不能作為左值右值!
41.for循環(huán)中使用continue 不會出現(xiàn)死循環(huán) ,但是while 中使用continue容易出現(xiàn)死循環(huán) ,因為可能i 沒有自加冰木!
42.取最大優(yōu)先分析原則會取最長的類型 ,所以要這么義:list<vector<string> > lovos;右邊兩個>> 之間必須有空格 ,如果沒有則編譯器可能解釋成 >>右移操作符穷劈!
43.對于平凡整型常量,可以用枚舉量來表示!
44.派生類賦值給基類是不要使用對象繼續(xù)賦值 ,而是使用指針或引用以避免發(fā)生截切踊沸!
45.不使用 void * 為類型轉(zhuǎn)換的中介類型是良好的編程習(xí)慣 ,因為void * 會抹除指針的類型信息歇终!
46.使用引用類型或標(biāo)準(zhǔn)庫組件以避免引入多級指針的復(fù)雜性是較佳的設(shè)計!
47.在類對象中盡量避免使用二級指針 ,尤其是在基類指向派生類對象的指針時尤其要注意逼龟!
48.在C++ 類中盡量不要重載類型轉(zhuǎn)換 operator函數(shù), 而是使用有明確含義的如 toInt(),toChar()等函數(shù)替代评凝!
49.C++中有時在類構(gòu)造函數(shù)前加上 explicit關(guān)鍵字來禁止隱式類型轉(zhuǎn)換可以減少很多錯誤!
50.多用引用傳遞參數(shù),用值傳遞時會有大量的復(fù)制操作 ,效率很低, 多用引用是好的編程習(xí)慣腺律!
51.函數(shù)對象就是重載了operator()的 class對象, 使用函數(shù)對象生成匿名臨時對象是好的編程習(xí)慣奕短!
52.使用dynamic_cast<>,static_cast<>,const_cast<>,reinterpret_cast<> !
53.在派生類構(gòu)造函數(shù)中盡量多使用成員初始化列表 ,靜態(tài)數(shù)據(jù)成員和數(shù)組不允許在成員初始化表中進行初始化 ,可以在函數(shù)體中進行初始化疾渣!
54.在類中涉及到指針和引用等 ,最好顯示撰寫深拷貝構(gòu)造函數(shù)和賦值運算符重載 operator=(),以免出現(xiàn)錯誤篡诽!
55.子類在繼承父類時如果重寫父類的虛函數(shù)或者非虛函數(shù) ,要保證在子類中重寫的函數(shù)訪問修飾符和父類結(jié)合繼承訪問后得到的訪問修飾符結(jié)果一致!
56.在寫拷貝構(gòu)造函數(shù)和重寫賦值運算符函數(shù)時必須把類中所有變量都用 '='號顯示寫全了,不要寫一部分 ,如果你沒寫, 則編譯器只會調(diào)用默認構(gòu)造函數(shù)進行變量初始化 ,而不會默認用'='號榴捡!
57.盡量不要在類中使用靜態(tài)變量 ,永遠不要做運行期靜態(tài)初始化杈女!
58.對class 對象或者有可能是 class對象的實體進行直接初始化而不是用賦值語句初始化 ,如:N n(0)!
59.搞清楚復(fù)制初始化和賦值初始化的不同 ,復(fù)制初始化是調(diào)用拷貝構(gòu)造函數(shù)實現(xiàn) ,而賦值是重載'='實現(xiàn)吊圾!
60.可以通過在private 區(qū)域聲明拷貝構(gòu)造函數(shù)來禁止類的復(fù)制初始化达椰!
61.對象作為參數(shù)盡量使用引用傳遞 ,其次考慮指針,盡量不要用值傳遞 ,如果不想修改對象可以加 const!
62.拋出匿名臨時異常對象,并以引用的方式捕獲它們 ,如需重新拋出,則拋出既有的異常對象 ,而非處理原始的異常之后 ,拋出一個新的異常對象项乒!
63.不要返回函數(shù)作用域內(nèi)所分配的存儲的引用(返回指針或直接傳值可以) ,會造成內(nèi)存泄漏啰劲!
64.使用類的構(gòu)造函數(shù)和析構(gòu)函數(shù)來封裝一些成對的操作如加鎖和解鎖等 ,這樣在函數(shù)執(zhí)行開始時創(chuàng)建類對象 ,使用A a; 而不適A a();或 A()來創(chuàng)建, 在函數(shù)結(jié)束前會自動刪除改對象 ,也就實現(xiàn)了開始時調(diào)用加鎖操作 ,結(jié)束時調(diào)用解鎖操作,俗稱 RAII(資源獲取即初始化)!
65.復(fù)制auto_ptr 模板實例化對象將指向的對象的控制權(quán)轉(zhuǎn)移 ,然后把復(fù)制源設(shè)為空檀何!
66.永遠不要把auto_ptr 實例化的類型作為 STL容器的基本類型蝇裤!
67.不要將auto_ptr 對象作為函數(shù)參數(shù)按值傳遞 ,會清空原有對象,造成不可預(yù)知的錯誤!
68.不要在虛函數(shù)中提供參數(shù)的默認初始化物频鉴!
69.訪問層級(public protected private) 對重寫虛函數(shù)沒有任何影響 ,即使public 繼承,你也可以將繼承過來的本來應(yīng)該是 public的函數(shù)寫到private 作用域中 ,完全可以栓辜!
70.派生類中對基類中的非虛函數(shù)的重寫或重載其實是遮掩 ,會將基類中同名的所有虛函數(shù)和非虛函數(shù)全部遮掩 ,使之無效, 這時想要構(gòu)成重載 ,必須使用using A::fun() 函數(shù)來導(dǎo)入基類中 fun函數(shù)!
71.重載必須在同一個類作用域下才構(gòu)成重載 ,否則只是遮掩垛孔!
72.重載虛函數(shù)要么對基類中的每一個都重寫要么一個都不要重寫 ,或者使用using A::fun() 藕甩!
73.C++中盡量避免使用指針,而是使用引用!
74.復(fù)制操作不經(jīng)由模板成員函數(shù)來實現(xiàn) ,必須顯示給出復(fù)制操作的實現(xiàn)周荐!
75.用戶自定義版本的后置式形式自增自減運算符應(yīng)該返回常量 ,因為后置后置不能作為左值狭莱!
76.前置式總是優(yōu)于后置式,即 ++i總是優(yōu)于i++ 僵娃!
77.非成員友員允許在第一個參數(shù)上施行類型轉(zhuǎn)換 ,而成員函數(shù)不能在第一個參數(shù)上施行類型轉(zhuǎn)換!
78.在進行指針重新復(fù)制時一定要注意是否可能造成內(nèi)存泄漏 ,是否要先釋放當(dāng)前指針?biāo)竷?nèi)存空間腋妙!
79.mutable變量可以在const 函數(shù)中被修改 ,其效果好于const_cast<>, 所以盡量使用 mutable默怨!
80.類重載運算符時有時必須參數(shù)和函數(shù)都是 const,這樣保證在其他函數(shù)調(diào)用時即使傳遞常量參數(shù)也沒問題!
81.變量傳遞給常量參數(shù)可以 ,但是常量傳遞給變量參數(shù)卻不行辉阶!
82.多使用虛函數(shù)實現(xiàn)不同的功能 ,把基類盡量細分成更小的基類先壕!
83.使用動態(tài)綁定而不是條件式的分派實現(xiàn)類型相關(guān)的需求!
84.如果某個類型可能成為基類 ,則一開始就把它寫成抽象基類谆甜!
85.以public 方式繼承的基類一般應(yīng)該是抽象的 ,應(yīng)該集中精力于接口繼承而不是代碼復(fù)用垃僚!
86.接口類就是沒有數(shù)據(jù)成員 ,析構(gòu)函數(shù)聲明為虛函數(shù),普通成員函數(shù)皆為純虛函數(shù) ,不聲明構(gòu)造函數(shù)的類型!
87.要么public, 要么友元函數(shù) ,其它如protected 繼承后的函數(shù)交叉調(diào)用可能會出現(xiàn)問題规辱!
88.盡量不使用class 數(shù)組,多用 STL容器, 如vector,而且容器類型是指針而不是對象 ,如vector<B *>谆棺!
89.wget w1 = w2;調(diào)用拷貝構(gòu)造函數(shù),而 wget w1;w1 = w2;調(diào)用的是類賦值運算符!
90.類參數(shù)傳值傳遞是調(diào)用拷貝構(gòu)造函數(shù) ,多用const 引用罕袋!
91.enum{star=5};這里定義的star 可以當(dāng)作常量字面量來用 ,和#define star 5 效果是一樣的改淑!
92.盡量使用const,enum,inline 來代替#define,使用模板 inline函數(shù)代替宏!
93.對于單純常量,最好用 const和enum 代替#define,對于形似函數(shù)的宏 ,最好使用inline 函數(shù)來替代浴讯!
94.如果const 出現(xiàn)在左邊則所指的是常量 ,如果const 出現(xiàn)在右邊 ,則指針是常量朵夏!
95.STL中const vector<int>::iterator 相當(dāng)于Tconst,vector<int>::const_iterator相當(dāng)于const T !
96.函數(shù)的const 版本可以和原版本重載 ,用非const 函數(shù)調(diào)用 const函數(shù)可以減少代碼重復(fù)榆纽!
97.使用函數(shù)返回靜態(tài)對象將 non-local static對象轉(zhuǎn)化為locat static 對象仰猖!
98.引用的賦值相當(dāng)于把等號右邊別名所指的對象值替換了等號左邊別名所指對象的值,還是 2個對象奈籽!
99.可以通過聲明純虛析構(gòu)函數(shù)來定義一個抽象類 ,這時純虛析構(gòu)函數(shù)必須給出定義才行饥侵!
100.析構(gòu)函數(shù)絕對不要吐出異常 ,即使出現(xiàn)異常也要在析構(gòu)函數(shù)內(nèi)部處理 ,要么結(jié)束要么吞下!
101.不要在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用 virtual函數(shù), 不會下降到 derived class類別, 用向上傳遞參數(shù)替換衣屏!
102.令賦值操作符返回一個reference to *this 躏升!
103.派生類中的拷貝構(gòu)造函數(shù)和賦值符號不會自動拷貝或賦值基類部分 ,所以要顯示調(diào)用基類拷貝或賦值函數(shù)!
104.在釋放內(nèi)存空間時先把原指針?biāo)竷?nèi)存區(qū)域備份 ,再刪除或指向新的內(nèi)存空間 ,再delete 原來備份的區(qū)域狼忱!
105.多使用tr1::shared_ptr 和auto_ptr智能指針來自動釋放內(nèi)存空間膨疏!
106.類中盡量不要定義類型轉(zhuǎn)換符號 ,即使定義也沒有返回類型 ,因為類型轉(zhuǎn)換符本身已經(jīng)規(guī)定了返回類型!
107.shared_ptr對象如果有多個指向一個指針 ,則只有第一個需要使用指針初始化 ,其他的要么用拷貝構(gòu)造函數(shù) ,要么用賦值運算符初始化 ,指針初始化只能用一次钻弄!
108.對于內(nèi)置類型成肘、STL和函數(shù)對象 ,傳值比較高效,但是對于其它類型 ,傳遞常量引用比較高效!
109.引用和指針一樣支持多態(tài)性 ,因為引用的內(nèi)部就是通過指針實現(xiàn)的斧蜕!
110.盡量用non-member 和non-friend函數(shù)替換 member函數(shù)!
111.如果一個函數(shù)和類相關(guān),但不是成員函數(shù) ,那么該函數(shù)也不一定非得是友元函數(shù) ,如果函數(shù)能通過類的公共接口完成功能 ,則完全不必聲明為友元函數(shù) ,但該函數(shù)返回值一般是const砚偶!
112.構(gòu)造函數(shù)如果不是explicit則可以進行隱式類型轉(zhuǎn)換 ,不管構(gòu)造函數(shù)有幾個參數(shù) ,但前提是如果你給的實際參數(shù)個數(shù)小于構(gòu)造函數(shù)需求參數(shù)個數(shù) ,你得保證構(gòu)造函數(shù)有默認構(gòu)造參數(shù)批销!
113.一個類內(nèi)對象內(nèi)部函數(shù)可以訪問對象自己的私有成員變量 ,但是如果有一個同類的另一個對象作為函數(shù)的參數(shù) ,則該內(nèi)部函數(shù)也可以訪問另一個對象的私有成員變量洒闸!
114.盡量往后定義變量的出現(xiàn) ,最好能等到變量不僅需要被使用而且初值也確定時再定義!
115.盡量避免使用轉(zhuǎn)型,即使必須使用也得使用 C++特定的如static_cast 等!
116.虛析構(gòu)函數(shù)都是public,沒有其它的像 private和protected 類型的均芽!
117.根據(jù)實際需要選準(zhǔn)模式,是 is-a 還是has-a,private 繼承和has-a類似 ,但是一般都是會選擇has-a丘逸!
118.因為private 繼承不是 is-a關(guān)系, 所以不能滿足基類指針指向派生類的情況 ,當(dāng)然不能使用多態(tài)性,只能看作是和 has-a一樣的情況了!
119.virtual函數(shù)即使是private 函數(shù)且被 private繼承, 雖然對于派生類不可訪問 ,但派生類還是可以繼承基類 virtual函數(shù)并重寫的,并無影響掀宋!
120.指針可以改變其指向的對象 ,但是引用不行,引用一旦賦值后不能改變深纲!
121.重載某個操作符時應(yīng)該返回引用而不是指針!
122.隱式轉(zhuǎn)換最多只能轉(zhuǎn)換一次 ,超過一次就被禁止劲妙!
123.前綴返回引用,后綴返回 const value,后綴通過前綴實現(xiàn),前綴效率比后綴高湃鹊!
124.在析構(gòu)函數(shù)中釋放資源,盡量使用引用來捕捉異常 ,而不用傳值或指針!
125.模板和異常規(guī)格不要混合使用 ,異常規(guī)格是一個應(yīng)該被審慎使用的特性镣奋!
126.STL中對于iterator 盡量運用 (*iterator).first來取值, 而不是用 ->來取值币呵!
127.C++禁止為非常量引用創(chuàng)建臨時變量 ,所以非常量引用傳遞參數(shù)時不會發(fā)生隱式類型轉(zhuǎn)換!
128.常量引用是會創(chuàng)建臨時變量的 ,這時會發(fā)生隱式類型轉(zhuǎn)換侨颈!
129.每一個重載運算符必須自帶至少一個用戶自定義類型的參數(shù)余赢!
130.操作符 -> 優(yōu)先級高于 * !
131.每種類有一個vtbl,每個對象有一個 vptr,RTTI是在vtbl 中增加一項 ,所以只會增加類大小,而不會增加對象大小哈垢!
132.析構(gòu)函數(shù)必須被定義妻柒!
133.auto_ptr對象最好使用const引用傳遞 ,而不要用值傳遞!
134.編譯器只能默認幫你進行一次類型轉(zhuǎn)換 ,超過一次就不行耘分!
135.對靈巧指針絕對不要提供一個轉(zhuǎn)換到原始指針類型的轉(zhuǎn)換操作符举塔!
136.當(dāng)使用類型轉(zhuǎn)換太麻煩時 ,不妨就使用模板吧!
137.一定要為含有指針的類提供深拷貝構(gòu)造函數(shù) ,以免在以后的運用中出現(xiàn)錯誤陶贼!
138.構(gòu)造函數(shù)和析構(gòu)函數(shù)可以被子類繼承 ,但如果析構(gòu)函數(shù)是虛函數(shù) ,繼承的子類的析構(gòu)函數(shù)也默認是虛函數(shù) ,但你最好加上virtual增加可讀性啤贩!
139.cout<<setiosflags(ios::fixed)<<setprecision(n)<<s1<<endl; 用來設(shè)置 C++中輸出小數(shù)點后位數(shù)!
140.使用extern “C” 可以將函數(shù)變成 c函數(shù)風(fēng)格, 即obj文件中不能進行名變換拜秧!
141.將十進制化為二進制或判斷能否被 2整除或者除以2可以使用右移操作和 &1操作痹屹!
142.C++和C語言中,把整數(shù)賦值給字符變量枉氮,是將整數(shù)當(dāng)作ASCII碼賦給字符變量志衍,將字符變量賦值給整數(shù)也是將字符變量對應(yīng)的ASCII碼賦給整數(shù)!
143.C++中STL容器的工作方式是對內(nèi)建類型是位拷貝聊替,自定義對象是存入對象的拷貝楼肪,使用insert或是push_back時都是使用拷貝,如果創(chuàng)建對象時是在堆中惹悄,則傳指針給STL春叫,如果在棧中,則傳遞對象本身!
144.C++中使用STL容器時暂殖,若對象拷貝動作較多价匠,基類又要記錄派生類,則存放指針呛每,若是基本類型或者很少拷貝踩窖,則存放對象!