標籤:規則 相互 namespace efault def 概念 end 重載 失敗
inline函數
函數重載
佔位參數和預設參數
/*__________________________________________________________________背景: C++中的const常量可以替代宏常數定義,const int A = 3; #define A 3 C++中的inline函數可以替代宏程式碼片段內嵌函式由 編譯器處理,直接將編譯後的函數體插入調用的地方宏程式碼片段 由前置處理器處理, 進行簡單的文本替換,沒有任何編譯過程 1)內嵌函式在編譯時間直接將函數體插入函數調用的地方 2)inline只是一種請求,編譯器不一定允許這種請求 3)內嵌函式省去了普通函數調用時壓棧,跳轉和返回的開銷 C++中內聯編譯的限制: 不能存在任何形式的迴圈語句 * 不能存在過多的條件判斷語句 * 函數體不能過於龐大 * 不能對函數進行取址操作 * 函數內聯聲明必須在調用語句之前 *__________________________________________________________________*/#include <iostream>using namespace std;#define MYFUNC(a, b) ((a) < (b)? (a):(b))inline int myfunc(int a, int b) { return (a < b? a : b);}int main(void) { int a = 1, b = 3; int c = 0;// c = MYFUNC(1, 3); c = myfunc(1, 3); cout << "c:" << c << endl; return 0;}
/*———————————————————————————————————— 1 函數重載概念函數重載(Function Overload) 用同一個函數名定義不同的函數 當函數名和不同的參數搭配時函數的含義不同2 函數重載的判斷標準 函數重載至少滿足下面的一個條件: 參數個數不同 參數類型不同 參數順序不同 !!!函數傳回值不是函數重載的判斷標準 3.編譯器調用重載函數的準則 精確匹配實參 通過預設參數能夠匹配實參 通過預設類型轉換匹配實參匹配失敗 最終尋找到的可行候選函數不唯一,則出現二義性,編譯失敗。 無法匹配所有候選者,函數未定義,編譯失敗。4.重載函數在本質上是相互獨立的不同函數(靜態鏈編) 函數重載是由函數名和參數列表決定的。 函數傳回值不能作為函數重載的依據 重載函數的函數類型是不同的 函數重載是發生在一個類中裡面5.函數重載與函數指標 當使用重載函數名對函數指標進行賦值時 根據重載規則挑選與函數指標參數列表一致的候選者 嚴格匹配候選者的函數類型與函數指標的函數類型————————————————————————————————————*/#include <iostream>#include <cstring>using namespace std;int func(int x) { return x; }int func(int a, int b) { return a + b; }//當函數的 預設參數 遇上 函數重載 會導致函數二義性,編譯失敗//int func(int a, int b, int c = 0) { return a * b *c; } int func(const char* s) { return strlen(s); }//函數重載與函數指標typedef int(*PFUNC)(int a); // int(int a)int main(int argc, char* argv[]) { int c = 0; c = func(1); printf("c = %d\n", c); c = func(1, 2); printf("c = %d\n", c); c = func("12345"); printf("c = %d\n", c); PFUNC p = func;//p是一個函數指標變數 c = p(1); printf("c = %d\n", c); return 0;}
/*____________________________________________________________________________________C++中可以在函式宣告時為參數提供一個預設值, 當函數調用時沒有指定這個參數的值,編譯器會自動用預設值代替函數預設參數的規則 一旦在一個函數調用中開始使用預設參數值,那麼這個參數後的所有參數都必須使用預設參數值 預設聲明後不得再次嘗試聲明來試圖更改預設值 函數佔位參數 佔位參數只有參數型別宣告,而沒有參數名聲明 一般情況下,在函數體內部無法使用佔位參數可以將佔位參數與預設參數結合起來使用 意義 為以後程式的擴充留下線索 相容C語言程式中可能出現的不規範寫法 ____________________________________________________________________________________*/#include <iostream> using namespace std;void printfAB(int x = 3) { printf("x:%d\n", x);} //在預設參數規則, 如果預設參數出現,那麼右邊的都必須有預設參數void printABC(int a, int b, int x = 3, int y = 4, int z = 5) { printf("x:%d\n", x);}int func(int a, int b, int ) {//佔位參數 placeholder para return a + b;}/*=================== 結合 ===================*/int Place_default(int a, int b, int = 0) { return a + b;}int main(int argc, char* argv[]) { printfAB(2); printfAB(); printf("func(1, 2, 3) = %d\n", func(1, 2, 3));//不可以 func(1, 2); int c1 = 0, c2 = 0; c1 = Place_default(1, 2); //ok c2 = Place_default(1, 2, 3);//ok cout << "c1:" << c1 << endl; cout << "c2:" << c2 << endl; return 0;}
[C++] 拓展屬性