C++: 默認參數(shù)和內(nèi)聯(lián)函數(shù)(inline function)

默認參數(shù)

C++允許函數(shù)設(shè)置默認參數(shù),在調(diào)用時可以根據(jù)情況省略實參,具體規(guī)則如下:

  • 默認參數(shù)只能按照右到左的順序
  • 如果函數(shù)同時有聲明、實現(xiàn),默認參數(shù)只能放在函數(shù)聲明中
  • 默認參數(shù)的值可以是常量、全局符號(全局變量、函數(shù)名)
int age = 10;
void test() {
    cout << "test()" << endl;
}
void display (int a, int b = 20, int c = age, void (*function)() = test) {
    cout << "a is " << a << endl;
    cout << "b is " << b << endl;
    cout << "c is " << c << endl;
    function();
}
int main(int argc, const char * argv[]) {
    display(100, 30);
    return 0;
}

注意:函數(shù)重載、默認參數(shù)可能會產(chǎn)生沖突、二義性(建議優(yōu)先選擇使用默認參數(shù))

void display (int a, int b = 10) {
    cout << "a is " << a << endl;
    cout << "b is " << b << endl;
}

void display (int a) {
    cout << "a is " << a << endl;
}

int main(int argc, const char * argv[]) {
   // 此處調(diào)用會有二義性
    display(10);
    
    return 0;
}

內(nèi)聯(lián)函數(shù)(inline function)

使用inline修飾函數(shù)的聲明或者實現(xiàn),可以使其變成內(nèi)聯(lián)函數(shù)

  • 建議聲明和實現(xiàn)都加上inline

特點:

  • 編譯器會將函數(shù)調(diào)用直接展開為函數(shù)體代碼
  • 可以減少函數(shù)調(diào)用的開銷
  • 會增大代碼體積(每一次調(diào)用都相當于將函數(shù)體代碼復(fù)制過去

注意:

  • 內(nèi)聯(lián)函數(shù)盡量不要超過10行代碼
  • 有些函數(shù)即使聲明為內(nèi)聯(lián)函數(shù),也不一定被編譯器內(nèi)聯(lián),比如遞歸
inline int sum (int a, int b) {
    return sum(a, b);
}

int main(int argc, const char * argv[]) {
    sum(10, 10);
    return 0;
}

內(nèi)聯(lián)函數(shù)和宏:

  • 內(nèi)聯(lián)函數(shù)和宏,都可以減少函數(shù)的調(diào)用開銷(直接調(diào)用函數(shù)體代碼,不需要為函數(shù)分配??臻g
  • 對比宏,內(nèi)聯(lián)函數(shù)多了語法檢測和函數(shù)特性
    語法檢測:是指在編譯階段進行語法檢查,如下代碼:
// 此處并不會報錯,而是在調(diào)用的時候才會報錯,且不會說明錯誤原因
#define sum(a, b) ((a) + (b))10000

int sum(int a, int b) {
    // 此處直接報錯
    100000
    return a + b;
}

函數(shù)特性:詳見如下代碼:

// 此處并不會報錯,而是在調(diào)用的時候才會報錯,且不會說明錯誤原因
#define sum(a) (a) 

int sum(int a) {
    return a + a;
}

int main(int argc, const char * argv[]) {
    int a = 10;
// 此處如果是調(diào)用的宏定義,會轉(zhuǎn)為 (a++) + (a++),對a會加兩次
// 如果是函數(shù)調(diào)用,sum(a++)中的a++會先計算,再進行函數(shù)內(nèi)的傳值
    int c = sum(a++);
    cout << c << endl;
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容