最近工作閑翻閱了之前買f《C++編程思想》這里貼上我認為對我最有幫助的部份,1來留給自己溫習看,另外一方面也和小火伴們分享下:
1.1、每一個對象都有1個類型,OOP中class 和type是同義詞,在面向對象的程序設計中,我們所做的工作實際上就是創造新的數據類型,程序員定義class 是為了與具體問題相適應,而不是被迫適用已存在的數據類型。
1.2、當用<>來指定文件時,預處理器以特定的方式來尋覓文件,1般是環境中或編譯器命令指定的某種尋覓路徑;當采取""指定文件時,通常是從當前目錄開始尋覓,如果文件沒有找到則按<>方式進行尋覓。
2.1、整數類型范圍從小到大為:short int->int->long int。
浮點類型范圍從小到大為:float->double->long double;
unsigned 數不保存符號,因此有1個過剩的位可用,所以它能存儲比signed數大兩倍整數
2.2、main()的內部和外部定義的變量寄存在不同的區域;數據和函數也存在不同區域
2.3、C++編程的1般原則是在定義時進行初始化,const 變量必須有初始值
2.4、enum可以提高程序清晰度,采取union可以節省內存,所有union 變量地址都是1樣的
2.5、 采取預處理器來完成代碼調試功能,具體實現以下:
2.7、同文件是我們和庫用戶之間的合約,合約描寫了庫中的數據結構,為函數調用規定了參數和返回值,頭文件中只限于申明,為了不頭文件的內容的屢次申明,我們可以采取以下方式避免:
2.8、如果程序員想允許顯式讓不屬于當前結果的1個成員函數訪問當前結構的對象時,可以借助friend 修飾符,friend 必須在1個結構內部聲明
3.1、class與struct 的區分在于class的成員默許是private,而struct的成員默許是public;
3.2、C++的安全性體現在初始化和清除兩個方面,用構造函數確保初始化,用析構函數確保清除
3.3、C++中宏被內聯函數(inline function)代替,這樣既保證了高效性(成員函數和預處理器宏1樣高效)也保證了安全性(當調用內聯函數時,編譯器首先確保調用正確,即所有的參數類型都滿足,宏定義在預處理中,不能進行檢查)。
任何在類中定義的函數都自動的成為內聯函數;
使用內聯函數的目的是減少函數調用的開心,但是如果函數交大,由于需要在調用函數的每處重復賦值代碼,這樣會使得代碼膨脹,因此小函數作為內聯函數比較理想
3.4、static使得變量存于靜態數據區中,而不是堆棧中。全局靜態對象的構造函數在main()之前調用,并且在退出main()后調用析構函數;
3.5、 關鍵字namespace如何class、struct、enum和union1樣把它們的成員的名字放到不同的空間去,但namespace與class 、struct、union和enum有著明顯的區分:
(1)namespace只能在全局范圍內定義,但他們之間可以相互嵌套;
(2)namespace定義的結尾沒必要隨著分號;
(3)1個namespace可以在多個頭文件中用1個標識符來定義;
(4)不能像class1樣去創建1個名字的實例;
(5)namespace可以用另外一個名字作為他的別名;
3.6、 & 在C++表示援用,援用可以理解為1個奇特的指針,這個指針的優點是沒必要懷疑它是不是初始化,援用的使用規則以下:
(1)利用創建是必須初始化;
(2)1個援用指向1個對象后不可轉變成另外一個對象的援用;
(3)不能NULL的援用
最常常看見援用的地方是函數參數和返回值中,當援用被用作函數參數是,在函數內任何對援用對象的修改將在函數外參數產生變化,固然也可傳遞指針來做相同的事情,但援用具有更清晰的語法。
3.7、拷貝構造函數(copy-constructor)是1種特殊的構造函數,需要援用來實現從現有的相同類型的對象中產生新的對象。編譯器使用拷貝構造函數通過值傳遞的方式在函數中傳遞和返回對象
3.8、使用delete void * 可能會出錯,在刪除之前必須把它轉為適當的類型,否則將會丟失內存;
3.9、C++確保在進入新類的構造函數體之前調用酥油的其他的構造函數,這樣所有子對象的成員函數所做的任何調用總是轉到這個被初始化的對象中,
4.1、多態永久產生在派生類中與基類之間,C++通過virtual函數和晚綁定(late binding)實現;
如果1個函數在基類中被申明為virtual ,那末所有的派生類中它都是virtual,可以對基類中的虛函數進行重寫;
在每一個帶有虛函數的類中,編譯器秘密放置了1個指針(vpointer)指向該對象的VTABLE(編譯器對每一個包括虛函數的類創建1個表:VTABLE)
編譯器從Instrument指針開始,該指針指向該對象的起始地址,對所有的Instrument或派生對象,他們的vptr都存在相同的位置(常常在對象的開頭),所以編譯器能夠取出該對象的vptr,vptr指向vtable的起始地址,所有的vtable都有相同的順序,如圖。play()第1個,what()第2個;
5、C++模板(template)
5.1、template告知編譯器,隨后定義將錯做1個或多個未指明的類型,當這個模板產生實際類代碼時,必須指定這些類型使得編譯器可以替換他們。