C 基本知識整理

2022-08-30 07:33:09 字數 4398 閱讀 7715

**

1. 全域性靜態變數

記憶體中位置:靜態儲存區,且程式執行期間一直存在。

未經初始化的全域性靜態變數自動初始化為0。

全域性靜態變數在宣告檔案之外是不可見的。

2.區域性靜態變數

記憶體中位置:靜態儲存區。

未初始化自動初始化為0。

作用域為區域性作用域,但離開作用域後不會銷毀,仍然駐留在記憶體中,再次訪問時值不變。

3.靜態函式

函式定義宣告預設為extern,但靜態函式只在宣告的檔案中可見,其他檔案不可見。

即使用static修飾則該函式只能在本檔案中使用,且不會與其他檔案中同名函式衝突。

全域性函式應在標頭檔案中宣告,區域性函式在cpp中宣告帶static

4.類靜態成員

同乙個類中靜態成員在多個物件之間資料共享。

5.類靜態函式

.在靜態成員函式中不能直接引用類中的非靜態成員,但可以引用類中的靜態成員。靜態成員函式中藥引用非靜態成員時要通過物件來引用

棧區:編譯器自動分配和釋放,存放函式引數值、區域性變數等,操作方式類似棧。棧區最大值為1m,可以調整

堆區:手動申請的動態記憶體,分配方式類似於鍊錶。

全域性/靜態區(資料段):已初始化的全域性變數和靜態變數。

bss段:未初始化的全域性變數和靜態變數,以及被初始化為0的全域性變數和靜態變數

程式**區(**段):存放函式體二進位制**,唯讀儲存區。

首先引數從右向左壓棧,將返回位址壓棧,再將棧幀壓棧。

生成乙個臨時變數,將其引用作為函式引數傳入函式內。不能返回區域性變數指標和引用。

strcpy為字串拷貝函式,原型:char *strcpy(char* dest, const char *src);

從src拷貝到dest,遇到『\0』結束。可能導致越界,安全應用strncpy(char* dest, const char *src,n)

strlen計算字串長度。到『\0結束』

1.++i

int & int::operator++()

2.i++ (返回應是常量!

const

intint::operator++(int

)

1. 指標有分配空間(大小是4個位元組),引用沒有(sizeof大小為引用物件的大小)

2. 指標初始化為null(nullptr),引用必須初始化為乙個已有物件的引用。

3.引數傳遞時,指標需要解引用(*)才可以對物件操作,引用則可以直接修改。

4.指標在使用中可以改變指向的物件,但引用僅是別名,不能改變。

5.可以有多級指標,但引用只有一級(&&為右值引用)

new/delete是c++關鍵字,而malloc/fre是c語言庫函式。

new是先分配記憶體,再構造物件,然後將物件繫結到記憶體的位址上。

delete是先析構物件,再釋放記憶體。

malloc和free僅對記憶體操作,不使用構造/析構函式。

四個智慧型指標為:shared_ptr,weak_ptr,unique_ptr,auto_ptr,前三個c++11支援

智慧型指標原理:智慧型指標為乙個類,超出類作用域後,類會子懂呼叫析構函式,析構函式則會自動釋放資源。

所以智慧型指標即在函式結束時自動釋放記憶體空間,不需要手動釋放。

1. shared_ptr

多個該智慧型指標可以指向相同物件,該物件和其相關資源在最後乙個引用被銷毀時釋放。

通過use_count()檢視資源所有者個數。可以通過new來構造,也可以傳入其他智慧型指標構造。

呼叫release()時,可以手動釋放資源所有權,且引用計數減一,當計數為0時資源被釋放。

使用make_shared()或建構函式可以傳入普通指標,或者通過get函式獲取普通指標。

成員函式:

use_count()  返回引用計數

unique 返回是否獨佔(即引用計數為1)

reset()  放棄物件的所有權

2. unique_ptr(替換auto_ptr)

同一時間只有乙個智慧型指標可以指向該物件。

不能將乙個unique_ptr賦值給另乙個,但如果源unique_ptr為乙個右值則可以賦值。

3. weak_ptr

weak_ptr不控制物件生命週期,指向share_ptr管理的物件,僅是一種訪問手段,但不會引起引用計數的增加或減少,是一種弱引用,不能訪問物件的成員函式,需要通過lock()轉化為shared_ptr才可以。

expired()  若use_count為0則返回true,否則返回false

lock() 返回物件的shared_ptr,不存在則返回空shared_ptr。

智慧型指標主要用於管理在堆上分配的記憶體,將普通指標封裝成棧物件。當棧物件生存週期結束後,在析構函式中釋放申請的記憶體,防止記憶體洩漏。

在兩個shared_ptr成員變數指向對方時會造成迴圈引用,使引用計數失效,從而導致記憶體洩漏。為了解決這個問題,使用weak_ptr可以解決這個問題,weak_ptr不會修改引用計數,從而避免無法訪問。

主要實現引用計數,什麼時候銷毀底層指標,賦值和拷貝構造時引用計數變化。

參考:儲存:底層真實指標,使用指標儲存引用計數。

建構函式:

templateshared_ptr

::shared_ptr(t *p):ptr(p),use_count(new_int(1))

拷貝建構函式

templateshared_ptr

::shared_ptr(const shared_ptr&orig)

過載=運算子

當賦值後,需要判斷原物件的引用計數。templateshared_ptr

& shared_ptr::operator=(const shared_ptr&rhs)

ptr=rhs.ptr;

*use_count=*(rhs.use_count);

return *this;}

return *this;

}

析構函式

templateshared_ptr::~shared_ptr()

}

指向乙個具體函式的指標變數。每乙個函式都有乙個入口位址,該入口位址就是函式指標指向的位址,可以使用該指標變數呼叫函式。

#include

#include

pid_t fork(void);

呼叫fork()會建立乙個新程序。在子程序中fork呼叫返回的是0,父程序返回子程序的pid,如果錯誤則返回負值。

在呼叫fork()後,可以使用exec()載入二進位制映像來替換當前程序的映像。

在linux中對程序內部結構採用寫時複製的方法,而不是將父程序整體複製。(需要查閱)

在gcc下使用attribute宣告多個constructor、destructor

__attribute((constructor))void

before()

當物件結束生命週期時,系統自動執行析構函式。乙個類只能有乙個析構函式,不能過載。

如果不編寫析構函式,則無法**動態分配的記憶體。

析構順序  類本身的析構函式->物件成員的析構函式->基類析構函式

靜態函式在編譯時就已經確定執行時機,而虛函式則在執行時動態繫結。

虛函式使用虛函式表機制,呼叫時會增加一次記憶體開銷

過載:兩個函式名相同,但引數列表不同,在同乙個作用域內。

重寫:子類繼承父類,父類中函式時虛函式,在子類中重新定義了這個函式。

c++呼叫c函式需要extern c,因為c語言沒有過載。

隱藏:1.子類函式與父類函式的函式名相同,引數不同,不管父類是不是虛函式,都隱藏。

2.子類函式與父類函式名和引數都相同,但父類不是虛函式。

用在多重繼承中,防止繼承乙個類兩次:例如,類a派生類b,類c,d同時繼承b和c,此時就需要使用虛繼承防止繼承a兩次。

多型分為靜態多型和動態多型。

靜態多型指函式過載,在編譯時確定。

動態多型指虛表指標指向的虛表中的虛函式不同,執行時表現出來。

虛函式的實現:有虛函式的類中,類最開始的部分是乙個虛函式表的指標,指標指向乙個虛函式表,表中存放虛函式的位址,當子類繼承父類時也會繼承續函式表。當子類重寫父類中虛函式時,會將其繼承到的虛函式表中的位址替換為重寫的函式位址。使用虛函式會增加訪問記憶體開銷

析構函式必須是虛函式,為了保證建立乙個子類,父類指標指向該物件時,釋放基類指標可以釋放掉子類的空間,防止記憶體洩漏。

只有要當做父類時虛函式才需要,而虛函式則需要生成額外的虛函式表及虛指標占用額外記憶體,對於不會被繼承的類來說則會浪費記憶體。

在呼叫時首先將實參傳遞給形參,傳遞過程需要呼叫拷貝建構函式,如此會迴圈爆棧。

C 基本知識整理(1)

在c 程式設計中using namespace std 這條語句很常見,其中,namespace就是命名空間,而using是宣告,std是命名空間名。命名空間就是為了解決c 中函式變數的命名衝突所採取的一種措施,能夠解決多模組協同開發出現變數函式命名的衝突問題。1 using宣告及作用域 using...

C 基本知識整理(2)

1 建構函式 c 中定義了一種特殊的初始化函式,稱為建構函式 當物件被呼叫時,建構函式自動呼叫 建構函式名字與類名相同,也沒有返回型別和返回值 物件在生成過程中通常需要初始化變數或分配動態記憶體,用建構函式。程式中可以沒有建構函式,這時會執行乙個空的建構函式。下面來看建構函式例項 include u...

javascript基本知識整理三

全域性變數 定義在外邊的變數 若沒有用var宣告,則當這行賦值執行,則就將他認為是全域性變數。區域性變數 在函式內部裡宣告的變數,只能在該函式裡有效。bom物件 window物件的方法 prompt alert confirm close open settimeout setinterval cl...