歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++對C的函數拓展

C++對C的函數拓展

日期:2017/3/1 9:06:58   编辑:Linux編程

一,內聯函數

1.內聯函數的概念

  C++中的const常量可以用來代替宏常數的定義,例如:用const int a = 10來替換# define a 10。那麼C++中是否有什麼解決方案來替代宏代碼片段呢?C++中推薦使用內聯函數代替宏代碼片段,C++中使用inline關鍵字聲明內聯函數。注意:內聯函數聲明時inline關鍵字必須和函數定義結合在一起,否則編譯器會直接忽略內聯請求。

2.內聯函數示例

# include<iostream>
using namespace std;

/* 宏定義函數方式 */
# define FUN1(a,b) ((a)<(b)?(a):(b))

/* 內聯定義函數方式 */
inline int FUN2(int a,int b)
{
    return a < b ? a : b;
}

int main()
{
    int a = 1;
    int b = 3;

    // 宏定義方式的時候是在預編譯階段直接替換,++a<b?++a:b,因此此時返回的c是3(執行了兩次++)
    // int c = FUN1(++a, b);
    // 內聯函數方式是在編譯階段將函數體直接插入到調用的地方,最終生成的代碼是沒有函數定義的
    int c = FUN2(++a, b);

    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);


    return 0;
}

3.內聯函數的說明

  • 內聯函數在最終生成的代碼中是沒有定義的。
  • 內聯函數由編譯器處理,直接將編譯後的函數體插入在函數調用的地方。而宏代碼片段是由預處理器處理,進行簡單的文本替換,沒有任何編譯過程。
  • 內聯函數沒有普通函數調用時的額外開銷(壓棧,跳轉,返回),內聯函數具有函數的特征(參數檢查,返回類型)。
  • 現代的C++編譯器能夠進行編譯優化,因此一些函數即使沒有inline聲明,也可能被編譯器內聯編譯。C++編譯器不一定准許函數的內聯編譯請求。
  • 內聯編譯限制:不能存在任何形式的循環語句,不能存在過多的條件判斷語句,函數體不能過於龐大,不能對函數進行取地址操作,函數內聯聲明必須在函數調用之前。

二,默認參數

1.默認參數實例

  C++中可以在函數定義時為函數參數設置默認值,當在進行函數調用的時候,如果沒有指定這個參數的值,編譯器會自動用默認值替換。

# include<iostream>

using namespace std;

void print(int a = 3)
{
    cout << "a = " << a << endl;
}

int main()
{
    // 默認參數 打印結果: a = 3
    print();
    // 傳遞函數參數 打印結果: a = 5
    print(5);

    return 0;
}

2.默認參數的規則

  當函數的參數中使用了默認參數,那麼該參數後面的參數只能為默認參數,而不能為普通參數(因為在函數調用的時候,無法明確要傳遞的參數)。

三,占位參數

1.函數占位參數實例

  C++中占位參數只有參數類型的聲明,而沒有參數的名稱,一般情況下,在函數體內無法使用占位參數。

# include<iostream>
using namespace std;

/* 函數占位參數 */
void test(int a, int b, int)
{
    cout << "a = " << a << ",b = " << b << endl;
}

int main()
{
    // 調用含有占位參數的函數時,函數參數個數必須匹配,必須用3個參數而不是2個
    test(1, 2, 3);

    return 0;
}

2.占位參數和默認參數結合使用

  如果占位參數和默認參數結合使用,則在函數調用的時候可以傳遞該占位參數也可以不傳遞該占位的值。其意義是為了以後程序的拓展留下線索,同時兼容C語言的一些不規范語法。

# include<iostream>
using namespace std;

/* 函數占位參數和默認參數結合 */
void test(int a, int b, int = 3)
{
    cout << "a = " << a << ",b = " << b << endl;
}

int main()
{
    // 當函數占位參數和函數默認參數結合在一起的時候,我們調用函數的參數列表就可以傳2個或者3個參數了
    test(1, 2);
    test(1, 2, 3);

    return 0;
}

四,函數的重載

1.函數重載的概念

  所謂的函數重載就是用同一個函數名,定義不同的函數。

2.函數重載的規則

  1.函數的名稱必須一致。

  2.函數的參數個數不同。

  3.函數參數的類型不同。

  4.函數參數的類型順序不一致。

3.函數的返回值是否是函數重載的判斷標准?

   答案是否,函數的返回值不能夠作為函數重載的標准,例如我們定義一個簡單的函數void fun()和int fun(),當我在main()函數中調用fun();編譯器無法判斷是調用的第一個還是第二個,存在二義性,因此會報錯。

Copyright © Linux教程網 All Rights Reserved