C++基礎 inline 默認參數 函數占位參數
阿新 • • 發佈:2018-10-13
最終 ace 判斷語句 使用 調用 tab sin color pau
1. inline內聯函數
內聯函數用於替換宏,
實例:
其中宏和 ++ 連用有副作用。
#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() { int a = 1; int b = 3; //int c = myfunc(++a, b); int c = MYFUNC(++a, b); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); system("pause"); return 0; }
有以下註意:
(1)必須inline int myfunc(int a, int b)和函數體的實現,寫在一塊
(2)內聯函數在最終生成的代碼中沒有定義,C++編譯器直接將函數體插入函數調用處,所以內聯函數沒有普通函數調用時的額外開銷(壓棧,跳轉,返回),也不能取地址。
(3)內聯函數由編譯器處理,直接將編譯後的函數體插入調用的地方,宏由預處理器處理,進行簡單文本替換,沒有任何編譯過程。
(4)內聯編譯的限制:
不能存在循環語句,不能有太多判斷語句,函數體不能過於龐大,不能對函數體取地址,內聯聲明必須在調用語句之前。
2. 默認參數
如下:
void printAB(int x = 3) { printf("x:%d\n", x); }
規則:
(1)只有參數列表後面部分才可以使用默認參數。
(2)一旦在函數中使用默認參數,這個參數之後的參數都必須使用默認參數。
//在默認參數規則 ,如果默認參數出現,那麽右邊的都必須有默認參數 void printABC(int a, int b, int x = 3, int y=4, int z = 5) { printf("x:%d\n", x); } int main62(int argc, char *argv[]) { printAB(2); printAB(); system("pause"); return 0; }
3. 函數占位參數
如下:
int func(int a, int b, int ) { return a + b; } int main01() { //func(1, 2); //可以嗎? printf("func(1, 2, 3) = %d\n", func(1, 2, 3)); getchar(); return 0; }
函數占位參數:
(1)占位參數只有參數類型聲明,而沒有參數名聲明
(2)一般情況下,在函數體內部無法使用占位參數。
函數占位參數與默認參數結合
int func2(int a, int b, int = 0) { return a + b; } void main() { //如果默認參數和占位參數在一起,都能調用起來 func2(1, 2); func2(1, 2, 3); system("pause"); }
C++基礎 inline 默認參數 函數占位參數