總結一些筆記上的C和C 知識點

2021-09-08 19:51:26 字數 2759 閱讀 1419

1、如果沒有提供自己的copy建構函式,c++會提供乙個預設的copy建構函式,是成員到成員的copy。

2、c中static的作用:

1、隱藏:如果未加static,編譯多個檔案的時候,所有的全域性變數和函式都具有全域性可見性,故使用static可以在 不同檔案 中使用 同名的函式和同名的變數。

2、保持:只初始化一次,存在靜態儲存區(全域性變數和static變數存在這),內容可以持久儲存。

3、預設初始化為0,在靜態儲存區中記憶體中所有位元組預設值是0x00。

注:儲存在靜態儲存區的變數只初始化一次。

auto和static的區別:

auto型別區域性變數就是普通的區域性變數(不加修飾的區域性變數預設為該型別)。該型別區域性變數儲存在棧上,在動態儲存區,生命週期僅限於定義它的函式,函式結束,它就自動釋放。static型別區域性變數儲存在靜態儲存區,在程式整個執行期間都不釋放。兩者之間的作用域相同,但生存期不同。

static區域性變數在所處模組在初次執行時進行初始化工作,且只操作一次。

對於區域性靜態變數,如果不賦初值,編譯期會自動賦初值0或空字元,而auto型別的初值是不確定的。(對於c++中的class物件例外,class的物件例項如果不初始化,則會自動呼叫預設建構函式,不管是否是static型別)

在c中 static有了第二種含義:用來表示不能被其它檔案訪問的全域性變數和函式。但為了限制全域性變數/函式的作用域, 函式或變數前加static使得函式成為靜態函式。但此處「static」的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案(所以又稱內部函式)。注意此時, 對於外部(全域性)變數, 不論是否有static限制, 它的儲存區域都是在靜態儲存區,生存期都是全域性的. 此時的static只是起作用域限制作用, 限定作用域在本模組(檔案)內部.

使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名。

c+ +重用了這個關鍵字,並賦予它與前面不同的第三種含義:表示屬於乙個類而不是屬於此類的任何特定物件的變數和函式. 這是與普通成員函式的最大區別,

也是其應用所在, 比如在對某乙個類的物件進行計數時, 計數生成多少個類的例項,

就可以用到靜態資料成員. 在這裡面, static既不是限定作用域的, 也不是擴充套件生存期的作用, 而是指示變數/函式在此類中的唯一性. 這也是」屬於乙個類而不是屬於此類的任何特定物件的變數和函式」的含義. 因為它是對整個類來說是唯一的,因此不可能屬於某乙個例項物件的. (針對靜態資料成員而言, 成員函式不管是否是static, 在記憶體中只有乙個副本, 普通成員函式呼叫時, 需要傳入this指標, static成員函式呼叫時, 沒有this指標. )

3、深淺copy:

淺copy:建立物件用現有的物件來初始化,簡單賦值,不分配資源(指標變數成員分配動態記憶體)。

深copy:分配資源,需要自己定義的copy建構函式,不但copy成員,也copy分配的資源。

4、c++ const 關鍵字 

表示不可改變,不僅僅表示乙個常量,還可以修飾 資料成員、引數、返回值、成員函式、等,用於強制保護,不可被修改,增強健壯性。

5、定義常量 :

c 使用巨集#define定義

c++ 使用const定義

區別:const是有資料型別的常量,而巨集常量沒有, 編譯器對於資料型別可以進行靜態安全檢查,但是對於巨集常量不會進行安全檢查,僅僅是字元替換。

6、棧和堆

棧,在執行函式時,函式的內部變數的儲存單元在棧上建立,函式結束,這些儲存單元自動釋放,棧記憶體分配運算內置於處理器中,效率高,但是容量小。

堆,又稱動態記憶體分配,程式在執行時用malloc或new申請的記憶體,大小可以由申請決定,由程式設計師使用delete或者free來釋放,動態記憶體生存期自己決定,使用靈活。

7、new\delete 和malloc()\free() 

malloc()和free()是c語言的標準庫函式,new|delete是c++的運算子,都可以用來申請和釋放記憶體,但是malloc()和free()函式不在編譯器的控制許可權之內,不能把建構函式和析構函式的任務強加給它們。

8、#include編譯器從 標準庫 中開始搜尋;

#include"a.h"   編譯器從 使用者的工作路徑 開始搜尋。

9、c++程式呼叫被c編譯器編譯之後的函式需要加 extern"c" 

因為c++支援函式過載,c不支援函式過載

函式被c++編譯之後在庫中的名字與c編譯之後的不同。

例如:void foo (int x ,int y); c編譯之後叫_foo,c++編譯之後叫_foo_int_int的名字,

c++提供了c連線的交換的指定符號 extern「c」 來解決名字匹配問題。

10、c++多型實現:

派生類和虛函式實現,基類和派生類使用同樣函式名,完成不同的操作具體實現相隔離的另一類介面;

多型提高了**的組織性和可讀性

虛函式則根據型別的不同來實現不同的隔離。

11、動態特性:

編譯時確定程式的功能,叫靜態特性。

程式的功能在執行時刻才確定,動態特性。

c++ 中使用 :虛函式、動態繫結、多型、構成了出色的動態特性。

12、封裝 c++

封裝即資訊隱藏,通過特性和行為的組合來建立新資料型別,讓介面和具體實現相隔離,

c++通過類來實現,讓模組僅僅公開必須讓外界知道的介面,來避免模組之間的行為干擾。

13、rtti (run-time type identification)

只有乙個指向基類的指標或引用是確定乙個物件的準確型別。

c 模板的一些知識點總結

一 1 可以為類模板的模板引數提供預設引數,函式模板卻不行。2可以為類模板進行偏特化,而函式模板卻不行。二 模板引數 1 型別 可以是內建型別或是使用者自定義型別 2 無型別引數 整數,指標,某些靜態實體的引用 例 bitset 3 其他模板 三 關於typename 若乙個模板 內部的某個型別被模...

C 的一些知識點

include using namespace std 內聯函式,交換兩個數的值 建議直接定義,不用先在開頭宣告再在後面定義 inline void swap int a,int b int main int p newint 分配1個int型的記憶體空間 delete p 釋放記憶體 int p ...

一些知識點總結

mysql資料庫中varchar和char的區別 1 varchar的長度是可變的,char的長度不可變。2 儲存時,char型別的資料要比varchar型別的資料速度更快,因為其長度固定,方便儲存於查詢。3 從儲存空間的角度講,因為插入型別資料的長度固定,有時候需要用空格進行佔位,所以儲存資料時占...