C++學習筆記

1.struct成員默認訪問方式是public,而 class默認訪問方式是private!

2.exit函數終止程序執行會調用析構函數 ,abort函數終止程序不會調用析構函數!

3.靜態局部變量直到程序終止時才退出!

4.通過public 函數返回 private成員的引用有可能會破壞類的封裝 ,造成外部變量可以改變類私有成員值!

5.常量對象只能調用常量成員函數,常量成員函數可以有非常量版本重載!

6.常量數據成員只能在定義時初始化或者在構造函數裏用成員初始化值來初始化 ,不能用賦值語句來初始化!

7.要在析構函數裏面使用delete來釋放使用 new申請的內存空間!

8.編寫析構函數來釋放類中成員所申請的內存空間和使用深拷貝函數是好的編程習慣!

9.operator++()是相當與++d,operator++(int) 是相當於 d++ !

10.如果父類中函數是虛擬函數 ,那麼在每個子類中顯式聲明虛擬函數是好的編程習慣!

11.如果類作爲基類,其析構函數要聲明爲虛析構函數 ,這樣派生類纔可以調用自己的析構函數!

12.一個new 就對應一個 delete是好的編程習慣!

13.istream輸入read 是從文件中讀取 ,ostream輸出write 是寫到文件中去!

14.istream是seekg 重置文件指針位置 ,ostream是seekp, 文件用file.eof()來判斷是否讀取到文件尾部!

15.assert(條件), 當滿足條件時就不 assert,不滿足條件纔會assert!

16.對於不需要修改的變量,使用常量引用來傳遞參數可以既保證安全性又保證效率!

17.在循環之前調用srand(time(0)),然後在循環中調用 rand()函數可以使得每次隨機的結果都不相同!

18.一維數組形參如下:int a[],二維數組形參如下 :int a[][SIZE],第一個[] 是空的,後面必須非空!

19.#define A 10 後面沒有分號!

20.在局部函數中用new創建的變量是存在內存中的,即便局部函數執行完畢內存變量仍然存在,但是指向它的指針有可能是局部變量,則需要在局部函數結束前調用 delete釋放內存空間,以免內存泄漏

21.數組聲明最好用 T *a 來聲明 ,這樣不容易出錯,創建對象最好用 new 而不是直接創建!

22.定義一個類時,析構函數(釋放資源)和拷貝構造函數(深拷貝)最好顯示定義!

23.C/C++語言輸入結束符是ctrl+z(windows下 )!

24.C語言的printf(“%.9lf”,a); 比c++的 setprecision(10)來的更加精確,C++有時自動舍入精度!

25.理清狀況,邏輯嚴謹,變量初始化、是還是否、邊界判斷判斷正確!

26.要使得棧中的基本元素是模板類類型,必須要定義模板類的一些函數:默認構造函數,友員輸出函數等!

27.用單件模式和全局函數替代全局變量,以便於拓展和維護!

28.用const char *ptr 表示ptr指向的變量爲常量。 char* const ptr表明ptr 本身爲常量是好的編程習慣!

29.const int *i = &a, 只是代表不能通過 i指針來修改,但是可以通過其它途徑來修改 a,例如a=3 !

30.靈活熟練運用語言,如 (a<b?a:b<c?b:c) = val();這句話就將3 個if語句合併成一句話!

31.橋接模式bridge 可以實現接口與實現分離 ,這樣可以減少修改類時需要修改的類的範圍!

32.優先級:i++ 高於 ++i ,注意,具體運算符優先級看下面的運算符優先級表!

33.遞歸算法符合大致算法思想就行了 ,不必深究思考,合理就可以了!

34.在C++ 中使用0來對指針初始化可以保證數字字面常量 0可以轉換成任何一種指針類型對應的空指針!

35.非const 對象可以調用 const和非const 函數,但是 const對象只能調用const函數!

36.可以使用非const 類型變量賦給 const類型參數,不能用const類型變量賦值給非 const類型參數!

37.類重載二元運算符時,要麼作爲類的只帶一個參數的內部函數 ,要麼作爲類中帶兩個參數的友元函數!

38.內建的operator-> 是二元的 ,而重載的operator-> 是一元的 ,如果重載了operator-> 則先調用重載的 ,直到重複調用到內建的operator->才終止!

39.儘量使用STL 是好的編程習慣!

40.++i返回的是內存變量,可以作爲左值也可以作爲右值 ,而i++ 返回的是字面量 ,不佔內存, 不能作爲左值右值!

41.for循環中使用continue 不會出現死循環 ,但是while 中使用continue容易出現死循環 ,因爲可能i 沒有自加!

42.取最大優先分析原則會取最長的類型 ,所以要這麼義:list<vector<string> > lovos;右邊兩個>> 之間必須有空格 ,如果沒有則編譯器可能解釋成 >>右移操作符!

43.對於平凡整型常量,可以用枚舉量來表示!

44.派生類賦值給基類是不要使用對象繼續賦值 ,而是使用指針或引用以避免發生截切!

45.不使用 void * 爲類型轉換的中介類型是良好的編程習慣 ,因爲void * 會抹除指針的類型信息!

46.使用引用類型或標準庫組件以避免引入多級指針的複雜性是較佳的設計!

47.在類對象中儘量避免使用二級指針 ,尤其是在基類指向派生類對象的指針時尤其要注意!

48.在C++ 類中儘量不要重載類型轉換 operator函數, 而是使用有明確含義的如 toInt(),toChar()等函數替代!

49.C++中有時在類構造函數前加上 explicit關鍵字來禁止隱式類型轉換可以減少很多錯誤!

50.多用引用傳遞參數,用值傳遞時會有大量的複製操作 ,效率很低, 多用引用是好的編程習慣!

51.函數對象就是重載了operator()的 class對象, 使用函數對象生成匿名臨時對象是好的編程習慣!

52.使用dynamic_cast<>,static_cast<>,const_cast<>,reinterpret_cast<> !

53.在派生類構造函數中儘量多使用成員初始化列表 ,靜態數據成員和數組不允許在成員初始化表中進行初始化 ,可以在函數體中進行初始化!

54.在類中涉及到指針和引用等 ,最好顯示撰寫深拷貝構造函數和賦值運算符重載 operator=(),以免出現錯誤!

55.子類在繼承父類時如果重寫父類的虛函數或者非虛函數 ,要保證在子類中重寫的函數訪問修飾符和父類結合繼承訪問後得到的訪問修飾符結果一致!

56.在寫拷貝構造函數和重寫賦值運算符函數時必須把類中所有變量都用 '='號顯示寫全了,不要寫一部分 ,如果你沒寫, 則編譯器只會調用默認構造函數進行變量初始化 ,而不會默認用'='號!

57.儘量不要在類中使用靜態變量 ,永遠不要做運行期靜態初始化!

58.對class 對象或者有可能是 class對象的實體進行直接初始化而不是用賦值語句初始化 ,如:N n(0)!

59.搞清楚複製初始化和賦值初始化的不同 ,複製初始化是調用拷貝構造函數實現 ,而賦值是重載'='實現!

60.可以通過在private 區域聲明拷貝構造函數來禁止類的複製初始化!

61.對象作爲參數儘量使用引用傳遞 ,其次考慮指針,儘量不要用值傳遞 ,如果不想修改對象可以加 const!

62.拋出匿名臨時異常對象,並以引用的方式捕獲它們 ,如需重新拋出,則拋出既有的異常對象 ,而非處理原始的異常之後 ,拋出一個新的異常對象!

63.不要返回函數作用域內所分配的存儲的引用(返回指針或直接傳值可以) ,會造成內存泄漏!

64.使用類的構造函數和析構函數來封裝一些成對的操作如加鎖和解鎖等 ,這樣在函數執行開始時創建類對象 ,使用A a; 而不適A a();或 A()來創建, 在函數結束前會自動刪除改對象 ,也就實現了開始時調用加鎖操作 ,結束時調用解鎖操作,俗稱 RAII(資源獲取即初始化)!

65.複製auto_ptr 模板實例化對象將指向的對象的控制權轉移 ,然後把複製源設爲空!

66.永遠不要把auto_ptr 實例化的類型作爲 STL容器的基本類型!

67.不要將auto_ptr 對象作爲函數參數按值傳遞 ,會清空原有對象,造成不可預知的錯誤!

68.不要在虛函數中提供參數的默認初始化物!

69.訪問層級(public protected private) 對重寫虛函數沒有任何影響 ,即使public 繼承,你也可以將繼承過來的本來應該是 public的函數寫到private 作用域中 ,完全可以!

70.派生類中對基類中的非虛函數的重寫或重載其實是遮掩 ,會將基類中同名的所有虛函數和非虛函數全部遮掩 ,使之無效, 這時想要構成重載 ,必須使用using A::fun() 函數來導入基類中 fun函數!

71.重載必須在同一個類作用域下才構成重載 ,否則只是遮掩!

72.重載虛函數要麼對基類中的每一個都重寫要麼一個都不要重寫 ,或者使用using A::fun() !

73.C++中儘量避免使用指針,而是使用引用!

74.複製操作不經由模板成員函數來實現 ,必須顯示給出複製操作的實現!

75.用戶自定義版本的後置式形式自增自減運算符應該返回常量 ,因爲後置後置不能作爲左值!

76.前置式總是優於後置式,即 ++i總是優於i++ !

77.非成員友員允許在第一個參數上施行類型轉換 ,而成員函數不能在第一個參數上施行類型轉換!

78.在進行指針重新複製時一定要注意是否可能造成內存泄漏 ,是否要先釋放當前指針所指內存空間!

79.mutable變量可以在const 函數中被修改 ,其效果好於const_cast<>, 所以儘量使用 mutable!

80.類重載運算符時有時必須參數和函數都是 const,這樣保證在其他函數調用時即使傳遞常量參數也沒問題!

81.變量傳遞給常量參數可以 ,但是常量傳遞給變量參數卻不行!

82.多使用虛函數實現不同的功能 ,把基類儘量細分成更小的基類!

83.使用動態綁定而不是條件式的分派實現類型相關的需求!

84.如果某個類型可能成爲基類 ,則一開始就把它寫成抽象基類!

85.以public 方式繼承的基類一般應該是抽象的 ,應該集中精力於接口繼承而不是代碼複用!

86.接口類就是沒有數據成員 ,析構函數聲明爲虛函數,普通成員函數皆爲純虛函數 ,不聲明構造函數的類型!

87.要麼public, 要麼友元函數 ,其它如protected 繼承後的函數交叉調用可能會出現問題!

88.儘量不使用class 數組,多用 STL容器, 如vector,而且容器類型是指針而不是對象 ,如vector<B *>!

89.wget w1 = w2;調用拷貝構造函數,而 wget w1;w1 = w2;調用的是類賦值運算符!

90.類參數傳值傳遞是調用拷貝構造函數 ,多用const 引用!

91.enum{star=5};這裏定義的star 可以當作常量字面量來用 ,和#define star 5 效果是一樣的!

92.儘量使用const,enum,inline 來代替#define,使用模板 inline函數代替宏!

93.對於單純常量,最好用 const和enum 代替#define,對於形似函數的宏 ,最好使用inline 函數來替代!

94.如果const 出現在*左邊則所指的是常量 ,如果const 出現在*右邊 ,則指針是常量!

95.STL中const vector<int>::iterator 相當於T*const,vector<int>::const_iterator相當於const T* !

96.函數的const 版本可以和原版本重載 ,用非const 函數調用 const函數可以減少代碼重複!

97.使用函數返回靜態對象將 non-local static對象轉化爲locat static 對象!

98.引用的賦值相當於把等號右邊別名所指的對象值替換了等號左邊別名所指對象的值,還是 2個對象!

99.可以通過聲明純虛析構函數來定義一個抽象類 ,這時純虛析構函數必須給出定義才行!

100.析構函數絕對不要吐出異常 ,即使出現異常也要在析構函數內部處理 ,要麼結束要麼吞下!

101.不要在構造函數和析構函數中調用 virtual函數, 不會下降到 derived class類別, 用向上傳遞參數替換!

102.令賦值操作符返回一個reference to *this !

103.派生類中的拷貝構造函數和賦值符號不會自動拷貝或賦值基類部分 ,所以要顯示調用基類拷貝或賦值函數!

104.在釋放內存空間時先把原指針所指內存區域備份 ,再刪除或指向新的內存空間 ,再delete 原來備份的區域!

105.多使用tr1::shared_ptr 和auto_ptr智能指針來自動釋放內存空間!

106.類中儘量不要定義類型轉換符號 ,即使定義也沒有返回類型 ,因爲類型轉換符本身已經規定了返回類型!

107.shared_ptr對象如果有多個指向一個指針 ,則只有第一個需要使用指針初始化 ,其他的要麼用拷貝構造函數 ,要麼用賦值運算符初始化 ,指針初始化只能用一次!

108.對於內置類型、STL和函數對象 ,傳值比較高效,但是對於其它類型 ,傳遞常量引用比較高效!

109.引用和指針一樣支持多態性 ,因爲引用的內部就是通過指針實現的!

110.儘量用non-member 和non-friend函數替換 member函數!

111.如果一個函數和類相關,但不是成員函數 ,那麼該函數也不一定非得是友元函數 ,如果函數能通過類的公共接口完成功能 ,則完全不必聲明爲友元函數 ,但該函數返回值一般是const!

112.構造函數如果不是explicit則可以進行隱式類型轉換 ,不管構造函數有幾個參數 ,但前提是如果你給的實際參數個數小於構造函數需求參數個數 ,你得保證構造函數有默認構造參數!

113.一個類內對象內部函數可以訪問對象自己的私有成員變量 ,但是如果有一個同類的另一個對象作爲函數的參數 ,則該內部函數也可以訪問另一個對象的私有成員變量!

114.儘量往後定義變量的出現 ,最好能等到變量不僅需要被使用而且初值也確定時再定義!

115.儘量避免使用轉型,即使必須使用也得使用 C++特定的如static_cast 等!

116.虛析構函數都是public,沒有其它的像 private和protected 類型的!

117.根據實際需要選準模式,是 is-a 還是has-a,private 繼承和has-a類似 ,但是一般都是會選擇has-a!

118.因爲private 繼承不是 is-a關係, 所以不能滿足基類指針指向派生類的情況 ,當然不能使用多態性,只能看作是和 has-a一樣的情況了!

119.virtual函數即使是private 函數且被 private繼承, 雖然對於派生類不可訪問 ,但派生類還是可以繼承基類 virtual函數並重寫的,並無影響!

120.指針可以改變其指向的對象 ,但是引用不行,引用一旦賦值後不能改變!

121.重載某個操作符時應該返回引用而不是指針!

122.隱式轉換最多隻能轉換一次 ,超過一次就被禁止!

123.前綴返回引用,後綴返回 const value,後綴通過前綴實現,前綴效率比後綴高!

124.在析構函數中釋放資源,儘量使用引用來捕捉異常 ,而不用傳值或指針!

125.模板和異常規格不要混合使用 ,異常規格是一個應該被審慎使用的特性!

126.STL中對於iterator 儘量運用 (*iterator).first來取值, 而不是用 ->來取值!

127.C++禁止爲非常量引用創建臨時變量 ,所以非常量引用傳遞參數時不會發生隱式類型轉換!

128.常量引用是會創建臨時變量的 ,這時會發生隱式類型轉換!

129.每一個重載運算符必須自帶至少一個用戶自定義類型的參數!

130.操作符 -> 優先級高於 * !

131.每種類有一個vtbl,每個對象有一個 vptr,RTTI是在vtbl 中增加一項 ,所以只會增加類大小,而不會增加對象大小!

132.析構函數必須被定義!

133.auto_ptr對象最好使用const引用傳遞 ,而不要用值傳遞!

134.編譯器只能默認幫你進行一次類型轉換 ,超過一次就不行!

135.對靈巧指針絕對不要提供一個轉換到原始指針類型的轉換操作符!

136.當使用類型轉換太麻煩時 ,不妨就使用模板吧!

137.一定要爲含有指針的類提供深拷貝構造函數 ,以免在以後的運用中出現錯誤!

138.構造函數和析構函數可以被子類繼承 ,但如果析構函數是虛函數 ,繼承的子類的析構函數也默認是虛函數 ,但你最好加上virtual增加可讀性!

139.cout<<setiosflags(ios::fixed)<<setprecision(n)<<s1<<endl; 用來設置 C++中輸出小數點後位數!

140.使用extern “C” 可以將函數變成 c函數風格, 即obj文件中不能進行名變換!

141.將十進制化爲二進制或判斷能否被 2整除或者除以2可以使用右移操作和 &1操作!

142.C++和C語言中,把整數賦值給字符變量,是將整數當作ASCII碼賦給字符變量,將字符變量賦值給整數也是將字符變量對應的ASCII碼賦給整數!

143.C++中STL容器的工作方式是對內建類型是位拷貝,自定義對象是存入對象的拷貝,使用insert或是push_back時都是使用拷貝,如果創建對象時是在堆中,則傳指針給STL,如果在棧中,則傳遞對象本身!

144.C++中使用STL容器時,若對象拷貝動作較多,基類又要記錄派生類,則存放指針,若是基本類型或者很少拷貝,則存放對象!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章