#include#include#includevoid getmemory(char *p,int num)
int main()
記憶體對齊規則是按照結構體成員的宣告順序,依次安排記憶體,主要遵循以下兩個原則:
為什麼要記憶體對齊?
如0x1234567的大端位元組序和小端位元組序的寫法如下:
既然這些它都能實現,那它和class還能有什麼區別?
最本質的乙個區別就是成員預設屬性和預設繼承許可權的不同:
①若不指明,struct成員的預設屬性是public的,class成員的預設屬性是private的;
②若不指明,struct成員的預設繼承許可權是public的,class成員的預設繼承許可權是private的;
析構函式可以作為虛函式,也可以不作為虛函式。通常乙個類被用來作為基類的時候,才把析構函式寫成虛函式。一般情況下類的析構函式裡面都是釋放記憶體資源,而析構函式不被呼叫的話往往就會造成記憶體洩漏。析構函式作為虛函式為了當用乙個基類的指標刪除乙個派生類的物件時,利用到了多型的特性,派生類的析構函式會被呼叫。
1、修飾函式的區域性變數:
2、修飾全域性函式和全域性變數:
3、修飾類裡面的成員變數:
4、修飾類的成員函式:
c++中四種型別轉換是: static_ cast, dynamic. cast, const. cast, re interpret cast
1、const_ cast
用於將const變數轉為非const
2、static_ _cast
用於各種隱式轉換,比如非const轉const, void*轉指標等,static_ cast 能用於多型向上
轉化,如果向下轉能成功但是不安全,結果未知;
3、dynamic_ cast
用於動態型別轉換。只能用於含有虛函式的類,用於類層次間的向上和向下轉化。只能轉指
針或引用。向下轉化時,如果是非法的對於指標返回null,對於引用拋異常。要深入了解內部
轉換的原理。
它通過判斷在執行到該語句的時候變數的執行時型別和要轉換的型別是否相同來判斷是否
能夠進行向下轉換。
4、reinterpret_ cast
幾乎什麼都可以轉,比如將int轉指標,可能會出問題,盡量少用:
5、為什麼不使用c的強制轉換?
c的強制轉換表面上看起來功能強大什麼都能轉,但是轉化不夠明確,不能進行錯誤檢查,
容易出錯。
智慧型指標主要用於管理在堆上分配的記憶體,本質上是個類,它將普通的指標封裝為乙個棧物件。當棧物件的生存週期結束後,會在析構函式中釋放掉申請的記憶體,從而防止記憶體洩漏。
常見智慧型指標:
unique_ptr實現獨佔式擁有或嚴格擁有概念,保證同一時間內只有乙個智慧型指標可以指向該物件。它對於避免資源洩露(例如「以new建立物件後因為發生異常而忘記呼叫delete")特別有用。
shared_ptr實現共享式擁有概念。多個智慧型指標可以指向相同物件,當新增乙個物件時引用計數加1,當過期時引用計數減一。只有引用計數為0時,智慧型指標才會自動釋放引用的記憶體資源。從名字share就可以看出了資源可以被多個指標共享,它使用計數機制來表明資源被幾個指標共享。可以通過成員函式use_ count ()來檢視資源的所有
者個數。除了可以通過new來構造,還可以通過傳入auto ptr, unique_ ptr, weak_ ptr來構造。當我們呼叫release()時,當前指標會釋放資源所有權,計數減一。
當兩個物件相互使用乙個shared_ ptr 成員變數指向對方,會造成迴圈引用,使引用計數失效,從而導致記憶體洩漏。為了解決迴圈引用導致的記憶體洩漏,引入了weak_ ptr 弱指標,weak_ _ptr的建構函式不會修改引用計數的值,從而不會對物件的記憶體進行管理,其類似乙個普通指標,但不指向引用計數的共享記憶體,但是其可以檢測到所管理的物件是否已經被釋放,從而避免非法訪問。
多型的實現主要分為靜態多型和動態多型,靜態多型主要是過載,在編譯的時候就已經確定;動態多型是用虛函式機制實現的,在執行期間動態繫結。舉個例子:乙個父類型別的指標指向乙個子類物件時候,使用父類的指標去呼叫子類中重寫了的父類中的虛函式的時候,會呼叫子類重寫過後的函式。如果乙個父類有多個子類重寫父類中的虛函式,就可以通過父類指標實現「不變的**來實現可變的演算法」,這也是多型所體現的。
虛函式的實現:在有虛函式的類中,類的最開始部分是乙個虛函式表的指標,這個指標指向乙個
虛函式表,表中依次放了類中所以虛函式的位址(呼叫的時候相當於乙個個函式指標),實際的虛函式在**段(. text)中。當子類繼承了父類的時候也會繼承其虛函式表,當子類重寫父類中虛函式時候,會將其繼承到的虛函式表中的位址替換為重新寫的函式位址。使用了虛函式,會增加訪問記憶體開銷,降低效率。
舉例說明:
父類base
(建立的物件為b)中有虛函式f()
,g()
,h()
,他們的函式的位址依次在虛函式表中
子類derive
(建立的物件為d)繼承父類base
,新增虛函式g1()
,h1()
, 並且重寫父類函式f()
可以看到當子類重寫父類中虛函式時候,會將其繼承到的虛函式表中的位址替換為重新寫的函式位址
C 常見面試題
1.c中static有什麼作用 1 隱藏。當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,故使用static在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。2 static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就...
C常見面試題
1.bool型別,值為true或flase 正確答案 bool flag if flag if flag 以下均為不良風格 if flag true if flag 1 if flag false if flag 0 2.char 3.int int x if x 0 if x 0 4.float ...
C 常見面試題
vector中這兩個屬性很容易弄混淆。size是當前vector容器真實占用的大小,也就是容器當前擁有多少個容器。capacity是指在發生realloc前能允許的最大元素數,即預分配的記憶體空間。當然,這兩個屬性分別對應兩個方法 resize 和reserve 使用resize 容器內的物件記憶體...