C C 知識點複習筆記18 3 1

2021-08-15 23:35:19 字數 3598 閱讀 2195

運算子過載時要遵循以下規則:

1.除了類屬關係運算子"."、成員指標運算子".*"、作用域運算子"::"、sizeof運算子和三目運算子"?:"以外,c++中的所有運算子都可以過載.

2.過載運算子限制在c++語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子.

3.運算子過載實質上是函式過載,因此編譯程式對運算子過載的選擇,遵循函式過載的選擇原則.

4.過載之後的運算子不能改變運算子的優先順序和結合性,也不能改變運算子運算元的個數及語法結構.

5.運算子過載不能改變該運算子用於內部型別物件的含義.它只能和使用者自定義型別的物件一起使用,或者用於使用者自定義型別的物件和內部型別的物件混合使用時.

6.運算子過載是針對新型別資料的實際需要對原有運算子進行的適當的改造,過載的功能應當與原有功能相類似,避免沒有目的地使用過載運算子.

free釋放記憶體之後,指標還指向原來的那塊位址;

32位系統中mar(記憶體位址暫存器)為32bit,可定址範圍為2的32次方bit;

函式呼叫時,引數入棧的順序是從右往左;

呼叫約定:

__cdecl__fastcall與__stdcall,三者都是呼叫約定(callingconvention)

它決定以下內容:

1)函式引數的壓棧順序;

2)由呼叫者還是被呼叫者把引數彈出棧;

3)以及產生函式修飾名的方法;

1、stdcall呼叫約定:

1)引數從右向左壓入堆疊;

2)函式自身修改堆疊;

3) 函式名自動加前導的下劃線,後面緊跟乙個@符號,其後緊跟著引數的尺寸,格式為_functionname@number;

呼叫約定宣告的語法:

int __stdcall function(int a,int b)

2、cdecl又稱為 c 呼叫約定,是c和c++程式的預設呼叫方式.每乙個呼叫它的函式都包含清空堆疊的**,所以產生的可執行檔案大小會比呼叫_stdcall函式的大.注意:對於可變引數的成員函式,始終使用__cdecl的轉換方式.

1)引數從右向左壓入堆疊;

2)函式本身不清理堆疊,呼叫者負責清理堆疊;

3) 自動在函式名前加前導的下劃線,格式為_functionname;

呼叫約定宣告的語法: 

int function (int a ,int b)  // 不加修飾就是 c 呼叫約定

int __cdecl function(int a,int b)// 明確指出 c 呼叫約定

3、fastcall呼叫約定:它是通過暫存器來傳送引數的(實際上,它用ecx和edx傳送前兩個雙字(dword)或更小的引數,剩下的引數仍舊自右向左壓棧傳送,被呼叫的函式在返回前清理傳送引數的記憶體棧);

1) 函式的第乙個和第二個 dword 引數(或者尺寸更小的)通過 ecx 和 edx 傳遞,其他引數通過從右向左的順序壓棧;

2) 被呼叫函式清理堆疊;

3) 函式名前加上乙個 "@" 符號,後面也是乙個 "@" 符號和其引數的位元組數,格式為 @functionname@number;

呼叫約定宣告的語法:

int fastcall function(int a,int b)

1)引數從右向左入棧;

2)如果引數個數確定,this 指標通過 ecx 傳遞給被呼叫者;如果引數個數不確定,this 指標在所有引數壓棧後被壓入堆疊;

3)對引數個數不定的,呼叫者清理堆疊,否則函式自己清理堆疊;

唯一乙個不能明確指明的函式修飾;

5、nakedcall編譯器不會給這種函式增加初始化和清理**,更特殊的是,你不能用 return 返回返回值,只能用插入彙編返回結果。這一般用於實模式驅動程式設計.

採用1-4的呼叫約定時,如果必要的話,進入函式時編譯器會產生**來儲存esi,edi,ebx,ebp暫存器,退出函式時則產生**恢復這些暫存器的內容.nakedcall不產生這樣的**.nakedcall不是型別修飾符,故必須和_declspec共同使用.

__declspec(naked) int  add(int a,int b)

如果定義的約定和使用的約定不一致,則將導致堆疊被破壞,導致嚴重問題,下面是兩種常見的問題:

1)函式原型宣告和函式體定義不一致;

2)dll 匯入函式時宣告了不同的函式約定;

c++ 編譯時函式名修飾約定規則: 

__stdcall 呼叫約定: 

1) 以 "?" 標識函式名的開始,後跟函式名;

2) 函式名後面以 "@@yg" 標識參數列的開始,後跟參數列;

3) 參數列以代號表示: 

x--void , 

d--char, 

e--unsigned char, 

f--short, 

h--int, 

i--unsigned int, 

j--long, 

k--unsigned long, 

m--float, 

n--double, 

_n--bool, 

pa-- 表示指標,後面的代號表明指標型別,如果相同型別的指標連續出現,以 "0" 代替,乙個 "0" 代表一次重複;

4) 參數列的第一項為該函式的返回值型,其後依次為引數的資料型別,指標標識在其所指資料型別前;

5) 參數列後以 "@z" 標識整個名字的結束,如果該函式無引數,則以 "z" 標識結束;

其格式為 "?functionname@@yg*****@z" 或 "?functionname@@yg*xz",

例如 int test1(char *var1,unsigned long)-----「?test1@@yghpadk@z」 

void test2() -----「?test2@@ygxxz」 

__cdecl 呼叫約定:

規則同上面的_stdcall 呼叫約定,只是參數列的開始標識由上面的 "@@yg" 變為 "@@ya";

__fastcall 呼叫約定:

規則同上面的_stdcall 呼叫約定,只是參數列的開始標識由上面的 "@@yg" 變為 "@@yi";

vc++ 對函式的省缺宣告是 "__cedcl", 將只能被 c/c++ 呼叫. 

extern "c" 的作用:如果 add(int a, int b) 是在 c 語言編譯器編譯,而在 c++ 檔案使用,則需要在 c++ 檔案中宣告:extern "c" add(int a, int b),因為 c 編譯器和 c++ 編譯器對函式名的解釋不一樣(c++ 編譯器解釋函式名的時候要考慮函式引數,這樣是了方便函式過載,而在 c 語言中不存在函式過載的問題),使用 extern "c",實質就是告訴 c++ 編譯器,該函式是 c 庫裡面的函式。如果不使用 extern "c" 則會出現鏈結錯誤.

引用必須要初始化;

strcpy會複製陣列中的結束符\0;

八進位制沒有負號;

物件導向的五大基本原則:

s(single-resposibilityprinciple):單一職責原則;

o(open-closedprinciple):開放封閉原則;

l(liskov-substituionprinciple):黎克特制原則;

i(inte***ce-segregationprinciple):介面隔離原則;

d(dependecy-inversionprinciple):依賴倒置原則;

C C 知識點複習筆記18 3 3

建構函式不能宣告為虛函式 儲存型別 1 自動變數auto 函式中所有的非靜態區域性變數.2 靜態變數static 在變數前加上static關鍵字的變數.3 外部變數extern 一般用作全域性變數作用域的擴充套件 還有定義外部函式的時候前面也可以有乙個extern關鍵字 4 暫存器變數registe...

C C 常用知識點筆記

1.return break continue用法總結 首先通過乙個簡單的程式做乙個直觀上的理解 includeint main void printf i am here n printf i am leving n getch return 0 2.c c 語言中struct結構體定義中 pac...

複習知識點

題目 class aclass bextends aclass cextends aclass dextends ba obj newd system.out.println obj instanceofb system.out.println obj instanceofc system.out....