物件導向的c
《後台開發核心技術與應用實踐(徐曉鑫)》的學習筆記。
後台開發技術能力體系,自省!
後者先搜尋當前目錄,再搜尋標準頭檔案目錄
(1)strlen()是函式,在執行時才能計算。引數必須是字元型指標(char*),且必須是以』\0』結尾的。當陣列名作為引數傳入時,實際上陣列已經退化為指標了。它的功能是返回字串的長度。
(2)sizeof()是運算子,而不是乙個函式,在編譯時就計算好了,用於計算資料空間的位元組數。因此,sizeof不能用來返回動態分配的記憶體空間的大小。sizeof常用於返回型別和靜態分配的物件、結構或陣列所佔的空間,返回值跟物件、結構、陣列所儲存的內容沒有關係。
陣列指標int(*p)[n]
:指向一維陣列的指標,也稱行指標,專門用來指向二維陣列
指標陣列int*p[n]
:不能p=a
,可以*p=a
賦值這裡*p表示指標陣列第乙個元素的值,a的首位址的值
使用引用傳遞函式的引數時,在記憶體中並沒有產生實參的副本,而是對實參直接操作。當使用一般變數傳遞函式的引數時,當函式發生呼叫,需要給形參分配儲存單元,形參變數是實參變數的副本;如果傳遞的是物件,還將呼叫拷貝建構函式。因此,當引數傳遞的資料較大時,用引用比用一般變數傳遞引數的效率更高,所佔空間更少。
使用指標作為函式的引數雖然也能達到與使用引用同樣的效果,但是在被調函式中同樣要給形參分配儲存單元,且需要重複使用「*指標變數名」的形式進行運算,這很容易產生錯誤且程式的閱讀性較差;另一方面,在主調函式的呼叫點處,必須用變數的位址作為實參,這些都不太方便。
如果既要提高程式的效率,又要使傳遞給函式的資料不在函式中被改變,就應該使用常引用const 型別&引用名=目標變數;
共用體(聯合體)裡可以定義多種不同資料型別,這些資料共享一段記憶體,在不同時間裡儲存不同的資料型別和長度的變數。
int check() //1--小端 0---大端
一般64位機器上各個資料型別所佔的儲存空間如下所述。
(1)char:8bit=1byte。
(2)short:16bit=2byte。
(3)int:32bit=4byte。
(4)long:64bit=8byte。
(5)float:32bit=4byte。
(6)double:64bit=8byte。
(7)long long:64bit=8byte。
其中,long型別在32位機器上只佔4byte,其他型別在32位機器和64位機器都是佔同樣的大小空間。
union中變數共用記憶體,應以最長的為準,且在共用體內變數的預設記憶體對齊方式,必須以最長的double(8byte)對齊。
結構體中所有成員變數都分配空間,且空間總的大小應為結構的節邊界數(即結構中占用最大空間的型別所占用的位元組數sizeof(double)=8)的倍數。
巨集定義中注意加括號,尤其是帶引數的巨集定義,要給巨集體中的每個引數加上括號,並在整個巨集體上再加乙個括號。
do…while(0)將一組語句包成乙個復合語句,以防預處理時被拆散
__cplusplus是c++的預定義巨集,表示當前開發環境是c++。在c++語言中,為了支援過載機制,在編譯生成的彙編**中,會對函式名字進行一些處理(通常稱為函式名字改編),如加入函式的引數型別或返回型別等,而在c語言中,只是簡單的函式名字而已,並不加入其他資訊。所以,在c/c++混合程式設計的環境下,extern」c」塊的作用就是告訴c++編譯器這段**要按c標準編譯,以盡可能地保持c++與c的相容性。
struct中的成員訪問許可權預設是public,而class中則預設是private的。
在c語言裡,struct中不能定義成員函式,而在c++中,增加了class型別後,擴充套件了struct的功能,struct中也能定義成員函式了。
乙個成員函式如果在類中定義,在定義結束的}之後是不需要加分號的;僅宣告的話需要加分號。
空類佔1byte
靜態資料成員不佔空間
成員函式不佔空間
建構函式和析構函式不佔空間
如果乙個類中有乙個或者多個虛函式,沒有成員變數,那麼類相當於含有乙個指向虛函式表的指標,64位機佔8byte。
函式**是儲存在物件空間之外的,而且,函式**段是公用的。
(1)先寫乙個實際的類,類名為類模板名。
(2)將此類中準備改變的型別名改用乙個自己指定的虛擬型別名。
(3)在類宣告前面加入一行,格式為:template 實際型別物件名;
類模板名實際型別物件名(實參表列);(5)如果在類模板外定義成員函式,應寫成類模板形式:
template
函式型別 類模板名《自定義虛擬型別名》:
:成員函式名(函式形參表列)
(1)在全域性範圍中定義的物件(即在所有函式之外定義的物件),它的建構函式在檔案中的所有函式(包括main函式)執行之前呼叫。但如果乙個程式中有多個檔案,而不同的檔案中都定義了全域性物件,則這些物件的建構函式的執行順序是不確定的。當main函式執行完畢或呼叫exit函式時(此時程式終止),呼叫析構函式。
(2)如果定義的是區域性自動物件(如在函式中定義物件),則在建立物件時呼叫其建構函式。如果函式被多次呼叫,則在每次建立物件時都要呼叫建構函式。在函式呼叫結束、物件釋放時先呼叫析構函式。
(3)如果在函式中定義靜態(static)區域性物件,則只在程式第一次呼叫此函式建立物件時呼叫建構函式一次,在呼叫結束時物件並不釋放,因此也不呼叫析構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫析構函式。
建構函式的呼叫順序規則如下所述
1)基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序,而不是它們在成員初始化表中的順序。
2)成員類物件建構函式。如果有多個成員類物件,則建構函式的呼叫順序是物件在類中被宣告的順序,而不是它們出現在成員初始化表中的順序。
3)派生類建構函式。
而析構函式的呼叫順序與建構函式的呼叫順序正好相反,將上面3點內容中的順序反過來用就可以了。
虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。
通過虛函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向需要呼叫函式的物件即可。
純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=0」
建構函式不能宣告時為虛函式,析構函式可以宣告為虛函式,析構函式不是虛函式容易引發記憶體洩漏。當派生類物件經由乙個基類指標被刪除、而該派生類帶著乙個非虛析構函式,會導致物件的派生成分沒被銷毀掉,這可能形成資源洩漏、損壞資料結構等問題。
單例模式通過類本身來管理其唯一例項,該唯一例項是類的乙個普通物件,但設計這個類時,讓它只能建立乙個例項並提供對此例項的全域性訪問。
《後台開發核心技術與應用實踐》(一)
《後台開發核心技術與應用實踐》(二)
《後台開發核心技術與應用實踐》(三)
《後台開發核心技術與應用實踐》(四)
後台開發 核心技術與應用實踐
常用類庫 在c 中,臨時物件都是const型別的。可以使用union 聯合 判斷系統是大端 big endian 還是little endian 小端 只能把列舉賦值列舉變數,不能把元素的數值直接賦值列舉變數。共用體以最長的位元組為準,考慮記憶體對齊。結構體以內建型別的最小公倍數對齊。編譯階段 g ...
後台開發 核心技術與應用實踐1 2 函式
1.2 函式 1.函式的定義 乙個c程式是由若干個函式組成的,c語言被認為是面向函式的語言,而c 面向過程的程式設計也沿用了c語言使用函式的方法。在c 物件導向的程式設計中,主函式以外的函式大多是被封裝在類中的。主函式或其他函式可以通過類物件呼叫類中的函式。無論是c還是c 程式中的各項操作基本上都是...
後台開發核心技術與應用實踐讀書筆記(一)
include 與 include 後者搜尋當前目錄,在搜尋標準目錄 include與 include 兩者是不同的,前者是c 標準為了與c語言區別開,也為了正確的命名空間,規定的標頭檔案不帶.h 函式的定義 函式過載 c 允許同乙個函式名定義多個函式,但必須引數型別不同與引數個數不同。函式模板 建...