C 知識記錄1

2021-10-05 04:08:28 字數 1947 閱讀 3029

3.malloc和new

1.malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。但它們都可用於申請動態記憶體和釋放記憶體。

2.對於非內部資料型別的物件而言,用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free,因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,和乙個能完成清理與釋放記憶體工作的運算子delete。

3.new可以認為是malloc加建構函式的執行。new出來的指標是直接帶型別資訊的。而malloc返回的都是void*指標。new delete在實現上其實呼叫了malloc,free函式。

4.new 建立的是乙個物件;malloc分配的是一塊記憶體。

4.虛函式實現機制,虛繼承在sizeof中有沒有影響,建構函式能否為虛函式,與純虛函式

編譯器會為每個有虛函式的類建立乙個虛函式表,該虛函式表將被該類的所有物件共享。類的每個虛函式佔據虛函式表中的一塊。如果類中有n個虛函式,那麼其虛函式表將有n*4位元組的大小。

在有虛函式的類的例項中分配了指向這個表的指標的記憶體,所以,當用父類的指標來操作乙個子類的時候,這張虛函式表就顯得尤為重要了,它就像乙個地圖一樣,指明了實際所應該呼叫的函式。

編譯器應該是保證虛函式表的指標存在於物件例項中最前面的位置(這是為了保證取到虛函式表的有最高的效能——如果有多層繼承或是多重繼承的情況下)。 這意味著可以通過物件例項的位址得到這張虛函式表,然後就可以遍歷其中函式指標,並呼叫相應的函式。

->有虛函式或虛繼承的類例項化後的物件大小至少為4位元組(確切的說是乙個指標的位元組數;說至少是因為還要加上其他非靜態資料成員,還要考慮對齊問題);沒有虛函式和虛繼承的類例項化後的物件大小至少為1位元組(沒有非靜態資料成員的情況下也要有1個位元組來記錄它的位址)。

有純虛函式的類為抽象類,不能定義抽象類的物件,它的子類要麼實現它所有的純虛函式變為乙個普通類,要麼還是乙個抽象類。

特別的

(1)當存在類繼承並且析構函式中有必須要進行的操作時(如需要釋放某些資源,或執行特定的函式)析構函式需要是虛函式,否則若使用父類指標指向子類物件,在delete時只會呼叫父類的析構函式,而不能呼叫子類的析構函式,從而造成記憶體洩露或達不到預期結果;

(2)內聯函式不能為虛函式:內聯函式需要在編譯階段展開,而虛函式是執行時動態繫結的,編譯時無法展開;

(3)建構函式不能為虛函式:建構函式在進行呼叫時還不存在父類和子類的概念,父類只會呼叫父類的建構函式,子類呼叫子類的,因此不存在動態繫結的概念;但是建構函式中可以呼叫虛函式,不過並沒有動態效果,只會呼叫本類中的對應函式;

(4)靜態成員函式不能為虛函式:靜態成員函式是以類為單位的函式,與具體物件無關,虛函式是與物件動態繫結的。

11.extern 「c」的作用

extern "c"實現c++與c及其它語言的混合程式設計,是用在c和c++之間的橋梁。之所以需要這個橋梁是因為c編譯器編譯函式時不帶函式的型別資訊,只包含函式符號名字;而c++編譯器為了實現函式過載,編譯時會帶上函式的型別資訊,如他把上面的a函式可能編譯成_a_float這樣的符號為了實現過載。

extern "c"的慣用法:

在c++中引用c語言中的函式和變數,在包含c語言標頭檔案(假設為cexample.h)時,需進行下列處理:

extern 「c」{

#include 「cexample.h」

而在c語言的標頭檔案中,對其外部函式只能指定為extern型別,c語言中不支援extern "c"宣告,在.c檔案中包含了extern "c"時會出現編譯語法錯誤。

extern本身作為關鍵字修飾變數(函式)時宣告該變數(函式)是外部變數(函式),通常全域性變數在標頭檔案中用這種方式宣告,在對應原始檔中定義,來防止重定義的錯誤。

C 指標知識記錄

c c 中指標的運用十分頻繁,且極其容易出錯,一旦出現引用空指標或指標未釋放都可能引起程式的bug。其中,指標的指標這一概念更是不好理解,在這裡記錄一下指標一些問題的測試,便於將來查閱。測試1測試2 首先定義乙個void型指標p,將指標指向null void p null 接著定義乙個指標的指標pp...

雜碎知識記錄

清除客戶端快取 response.cache.setcacheability httpcacheability.nocache 絕對過期快取 向 cache 中插入具有依賴項和過期策略的物件。引數key用於引用該物件的快取鍵。value 要插入快取中的物件。dependencies 所插入物件的檔案...

小知識記錄

清除浮動 新增子元素,左右都不允許出現浮動元素。清除a的下劃線 text decoration none 清除li前的小圓點 li 聖杯布局 negative margin 關於文件流,浮動流和position input標籤的型別 color,date,email 可使用偽類 或 元素。style...