c 基礎隨手記事

2021-08-18 01:50:27 字數 2863 閱讀 4872

c++基礎隨手記事

1、深拷貝與淺拷貝

假若沒有自定義拷貝建構函式,系統會自動分配拷貝建構函式,但是這是淺拷貝

拷貝函式形式:ceexample(const ceexample& a)

拷貝函式在以下情況被呼叫:

a、乙個物件以值傳遞方式傳入函式體

b、乙個物件以值傳遞方式作為結果從函式返回

c、乙個物件用另乙個物件做初始化

深拷貝與淺拷貝的區別

比如物件a=物件b,當成員變數需要申請記憶體空間時,在淺拷貝當中,a中的成員變數不會申請新的記憶體空間,所以a中的指標變數與b中的指標變數指向同一片記憶體區域,而深拷貝當中,會為a中的指標變數申請乙個新的記憶體空間。

2、b樹與b+數

乙個m階的b樹滿足的性質有下面幾個

a、每個節點最多有m棵子樹

b、根節點至少含有兩顆子樹(如果含有子樹的情況下)

c、除了根節點以外,每個分支節點至少含有m/2棵子樹

d、每個節點的關鍵碼數量範圍為[ceil(m/2),m-1]  其中ceil代表向上取整

e、所有葉節點都要在同一層

b樹的插入:

插入一般在根節點,如果插入後關鍵字滿足以上情況,最主要是d情況,直接插入

否則,則要進行分類,**即將假如關鍵字的節點根據中間分為兩半,中間的關鍵字上移到其父節點,然後將**成的兩半分別對應接入。如果上移父節點導致父節點不滿足以上情況,就父節點繼續**。

b樹的刪除:

同插入一樣,如果滿足條件,先看d要求,滿足的話,直接刪除

如果不滿足,那麼就向兄弟節點借:

如果兄弟節點借出後仍然滿足條件,則兄弟節點借出的關鍵碼上移到父節點,父節點相應的關鍵碼下移到需要關鍵碼的節點

如果兄弟節點借出以後不滿足條件,那麼兄弟節點就不要借給他,缺少關鍵碼的節點直接合併到其兄弟節點,然後,父節點的關鍵碼下放,如果這樣導致父節點不滿足條件,就回溯上面的刪除過程。

b+樹:

首先b樹每個節點都儲存key和data值,而b+樹只是葉子節點儲存data值, 並且b+樹每個葉子節點加乙個指向相鄰節點的指標,因為b+樹只有葉子節點儲存data,所以其他的index節點可以儲存更多的key值

3.指標和引用的定義和性質區別:

(1)指標:指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元;而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的位址。

而下面2句定義了乙個整形變數a和這個整形a的引用b,事實上a和b是同乙個東西,在記憶體占有同乙個儲存單元。

(2)可以有const指標,但是沒有const引用;

(3)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)

(4)指標的值可以為空,但是引用的值不能為null,並且引用在定義的時候必須初始化;

(5)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了。

(6)"sizeof引用"得到的是所指向的變數(物件)的大小,而"sizeof指標"得到的是指標本身的大小;

(7)指標和引用的自增(++)運算意義不一樣;

4、各種資料型別大小

int  4byte,  long 4byte, double 8byte, float 4 byte

5、堆 和 棧 (這個以前提過了)

6、malloc和new  free跟delete

簡單理解 new=malloc+建構函式  delete=free+析構函式

7、那些函式不能為虛函式:

建構函式、靜態函式、友元函式  (這些函式都不能被繼承)

(ps:有個關鍵點,析構函式可以是虛函式且一般為虛函式,因為假若讓子類物件賦值給父類物件的時候,父類物件被刪除的時候不會呼叫子類的析構函式,可能會造成記憶體洩漏)。

8、記憶體對齊

每個成員變數對於結構體變數位址的偏移量正好是該成員型別所佔位元組的整數倍,且最終結構體占用位元組的大小為類中最大的元素的整數倍。且派生類成員不會占用基類的填充位元組。 注意強制對齊,gcc預設是4.

9、struct和class 的區別

在c++中,struct跟class基本沒有區別,struct預設繼承方式是public,而class的預設繼承方式是private

10、引用是除了指標以外,另乙個實現多型的方法

11、static

修飾類中變數的時候,可以不用建立類的例項,直接根據類名訪問

類的全部物件共享同乙個靜態變數

普通靜態變數, 只被初始化一次,並且預設是0

類修飾成員函式,不能被繼承

12、const

修飾變數的時候

13、值傳遞與用傳遞

函式引數傳遞機制問題在本質上是呼叫函式(過程)和被呼叫函式(過程)在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種:值傳遞和引用傳遞。以下討論稱呼叫其他函式的函式為主調函式,被呼叫的函式為被調函式。

值傳遞(passl-by-value)過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在堆疊中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值。

引用傳遞(pass-by-reference)過程中,被調函式的形式引數雖然也作為區域性變數在堆疊中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過堆疊中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

**:14、物件導向特性:封裝、繼承、多型

多型的原理推薦文章:(真的是超級良心的博主)

隨手記事系列 01

2020 年 2月的最後一天 外面好像下著小雨 今天是在北京隔離的第十一天 下週三就可以去公司上班了 隨手記事系列會一直更新,更新的時間段可能會不固定 今天這篇主要是想表述乙個觀點 覆巢之下豈有完卵 識時務者為俊傑。每次下雨心情就會比較惆悵 不太喜歡下雨 上月發的績效只發了百分之五十 原因細節就不多...

隨手記note(記事簿)

在敏捷軟體開發領域,更注重的以人為核心,迭代,循序漸進的開發方法。相比傳統的開發方法,這種方法能更快速的開發,上線,反饋,調整 迭代。以敏捷的姿態去發展產品。我們組所要做的課題是乙個簡單的記事功能的實現。現在網路上各種文件編輯器數不勝數,有emeditor,uestudio,gridinsoft n...

python字典基礎隨手記

將字串與其它格式之間相互轉換 使用json庫 import json json.dumps 字典 將字典轉換為字串 json.loads 字串 將字串轉換為字典 新建乙個字典 dic v1 建立字典 print dic v1 print type dic v1 將字典dic v1轉換為字串 prin...