C 學習筆記之C C 的區別

2021-09-11 01:40:42 字數 3554 閱讀 5138

c++學習的基本概要:

1、c和c++的去別

(1)帶預設值的引數的函式;

(2)inline內聯函式;

(3)函式過載;

(4)引用;

(5)const&指標&引用;

(6)new/delete

(7)命名空間;

2、c++物件導向

3、c++模板程式設計

4、c++運算子過載

5、c++繼承和多型

6、c++的i/o流的異常處理

7、c++設計模式

8、c++stl和boost庫

帶預設引數的函式:

1、函式形參預設值,必須從右往左

2、呼叫引數帶預設值的函式,有實參,取實參的值,沒實參,取預設值

3、 形參預設值,函式宣告,或者函式定義都定義給

4、預設引數只能給一次

5、實參是從左向右給形參賦值,和設定預設值的順序相反,相輔相成,共同給形參賦值。入棧是從右向左

6、帶預設引數的函式在呼叫的時候沒有mov指令,將變數的值裝入暫存器,只是有乙個push壓棧的過程。所以帶預設值引數的函式比沒有預設引數的函式呼叫更快。

inline內聯函式

1、inline函式和普通函式有什麼區別:

inline函式在編譯過程中,會把**在函式呼叫點進行展開,生成指令,省去了函式的呼叫過程中的棧幀的開闢和回退的消耗。

2、inline函式只是對編譯器的乙個建議,希望編譯器把這個函式設定為inline函式在呼叫點進行替換,具體由編譯器決定,但不能設定為遞迴函式,因為inline函式只是在呼叫點展開,並不知道真正遞迴的次數和結束條件。

3、inline函式的作用域和static修飾的函式一樣只對本檔案可見,優點是可以提高程式的執行效率,在大量呼叫函式的時候可以節省大量的普通函式呼叫的棧幀的開闢和回退。

4、inline和巨集的區別:

巨集是在預編譯期間對**的簡單替換,並沒有型別的檢查,而inline函式是在編譯期,在函式呼叫的時候,用函式體進行替換,同時用實參代替形參。

函式的過載

1、在編譯階段每乙個函式都會生成乙個符號,在c語言中函式符號就是函式名,而在c++中,函式生成的符號是函式名+引數列表(這就是為什麼c語言沒有函式過載的原因,就算引數列表不一樣但是生成的函式符號是一樣的,在鏈結時候的符號重定位會出現符號重定義的錯誤)

2、函式過載的要求:

a、函式名相同,但是引數列表不同,不能簡單通過返回值的不同而區分是否是過載

b、一組函式過載,必須處在同一的作用域裡。

c和c++中的const的區別:

c語言中:

1、const修飾的量不能作為左值

2、const修飾的量可以不初始化

3、const修飾的量是常變數,不能當做常量使用

4、編譯過程和普通變數沒有區別

在c++中:

1、c++編譯const的過程的是遇到常量的名字的地方替換成常量的初始值

2、常量是可以退化為常變數,當用乙個已初始化的變數來賦值給const修飾的量的時候,這時這個量為常變數。

const和指標的結合:

const int *==>int * error

const int ** <==int ** error

int ** ==>const int ** error

1)當const右邊有*號的時候,const才參與型別當中

2)const表示式出現錯誤的原因:

a、const常量作為左值

b、把常量的位址或者引用洩露出去(把常量的位址賦值給非常量的指標)

static 在c和c++中的區別:

1、在c中static修飾的變數表示資料儲存在靜態區,作用域為本檔案,在程式載入的時候就已經初始化。當static修飾全域性變數時,改變了全域性變數的作用域,使全域性變數變為本檔案可見,如果static修飾區域性變數時,改變了它的生存期(儲存方式變為靜態),只被初始化一次,下一次依據上一次的值。預設值為0;

2、在c++中,static修飾的變數也儲存在靜態區

1)在程式執行到定義的**的時候進行初始化,其餘具有在c裡面的所有性質

2)類的靜態成員函式屬於整個類而非類的物件,所以他沒有this指標,所以他僅能訪問類的靜態資料和靜態成員函式

3)不能將靜態成員函式定義為虛函式

4)由於靜態成員宣告於類中,操作於其外,所以對其取位址操作,就多少有些特殊 ,變數位址是指向其資料型別的指標 ,函式位址型別是乙個「nonmember函式指標」。

(5)static並沒有增加程式的時空開銷,相反她還縮短了子類對父類靜態成員的訪問 時間,節省了子類的記憶體空間。

(6)靜態資料成員是靜態儲存的,所以必須對它進行初始化。 (程式設計師手動初始化,否則編譯時一般不會報錯,但是在link時會報錯誤)

(7)靜態成員初始化與一般資料成員初始化不同:

初始化在類體外進行,而前面不加static,以免與一般靜態變數或物件相混淆;

初始化時不加該成員的訪問許可權控制符private,public等;

初始化時使用作用域運算子來標明它所屬類;

所以我們得出靜態資料成員初始化的格式:

《資料型別》《類名》::《靜態資料成員名》=《值》

(9)為了防止父類的影響,可以在子類定義乙個與父類相同的靜態變數,以遮蔽父類的影響。這裡有一點需要注意:我們說靜態成員為父類和子類共享,但我們有重複定義了靜態成員,這會不會引起錯誤呢?不會,我們的編譯器採用了一種絕妙的手法:name-mangling 用以生成唯一的標誌。

指標和引用有什麼區別:

1、從彙編的角度來講,指標和引用沒有什麼區別,引用的底層是由指標實現的

2、引用在定義時,就需要進行初始化,因為引用和指標一樣是對位址的操作,但有野指標,卻沒有野引用。

3、指標可以定義多級指標,而引用卻不能;

4、引用一旦指向一塊位址,就不能改變了,這也是引用必須在初始化的另乙個重要的原因

new 和malloc的區別:

1、new在c++裡是乙個關鍵字,而malloc在c裡面是乙個函式,兩個都是在堆裡開闢空間,new的底層是由malloc實現的

2、兩個方式的檢錯方式不一樣,new是丟擲乙個異常,來提示出錯;而malloc是返回乙個空指標

3、new 開闢空間是以元素的個數為單位,因為new的表示式中已經把資料的型別告訴了編譯器,它的意思是讓編譯器開闢這種型別的資料n個;而malloc是以位元組單位開闢的

4、new在開闢空間的時候可以進行初始化,而malloc 不能

c和c++中的struct的區別:

1、在vs中c是不能定義乙個空結構體,而在gcc中可以,大小為0;而c++中的空結構體的大小為1;這是因為在c++中struct是類,在定義乙個物件的時候,會先開闢空間,在呼叫建構函式,而建構函式是類的成員方法,引數列表中會自動帶乙個this指標,但又因為該結構體為空,為了表示有這個this指標,就用乙個1位元組的佔位符。

C C 之基礎學習筆記

1.空類 建構函式 成員函式都是不占用空間的,都是乙個size為1,作為類的佔位符,如何區分類 2.如果乙個類含有虛函式,那麼他的size將會是8 x64位 2.1 virtual大小是否與系統平台相關?x64和x86 2.2 vptr和vtable的原理和資料結構如何?3.建構函式的順序 先基類的...

《完美C C 》之C與C 的區別(一)

型別檢查的區別 列舉的區別 左值也可被賦值 1 型別檢查更嚴格 c 型別檢查比c語言更加嚴格 int main 同樣的 在c語法中就能編譯通過,但是在c 中就會報錯。1.1const int a在c 中就必須要初始化,不然就報錯,但是在c語言中就能編譯通過,而且是個隨機值。1.2上列中的 int p...

C 學習筆記之覆蓋 過載 多型的區別

覆蓋 在基類中定義了乙個非虛函式,然後在派生類中又定義了乙個同名同引數同返回型別的函式,這就是覆蓋了。在派生類物件上直接呼叫這個函式名,只會呼叫派生類中的那個。過載 在基類中定義了乙個非虛函式,然後在派生類中定義乙個同名,但是具有不同的參數列的函式,這就是過載。在派生類物件上呼叫這幾個函式時,用不同...