1. 程式人生 > >C++基礎 inline 默認參數 函數占位參數

C++基礎 inline 默認參數 函數占位參數

最終 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 默認參數 函數占位參數