默認參數(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;
}