函式預設引數(Default Function Arguments)
1. 語法
- 概念:函式預設引數允許在函式定義時為引數指定預設值,這樣在呼叫函式時可以省略這些引數。
- 語法:在函式宣告和定義時,為引數指定預設值。
示例程式碼:
// 函式宣告和定義
void print(int a = 5, int b = 10) {
std::cout << "a = " << a << ", b = " << b << std::endl;
}
int main() {
print(); // 使用預設引數:print(5, 10)
print(20); // 使用預設引數:print(20, 10)
print(20, 30); // 指定所有引數:print(20, 30)
return 0;
}
2. 特性
- 概念:函式預設引數提供了一種靈活的函式呼叫方式,使得函式呼叫更加靈活和簡潔。
- 特點:函式預設引數可以減少函式呼叫時的必要引數數量,同時保持函式的多功能性。
3. 二義性問題
- 概念:如果一個函式的過載版本和具有預設引數的函式在省略某些引數時可以匹配,則會產生二義性問題。
- 特點:編譯器無法確定呼叫哪個函式,導致編譯錯誤。
示例程式碼:
void func(int a, int b) {}
void func(int a) {}
int main() {
func(10); // 二義性:可以匹配 func(int, int) 透過使用預設引數,也可以匹配 func(int)
return 0;
}
行內函數(Inline Functions)
1. 宣告形式
- 概念:行內函數是一種建議編譯器在編譯時將函式體直接插入到每個呼叫點的函式。
- 語法:使用
inline
關鍵字宣告函式。
示例程式碼:
inline int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int result = max(5, 10); // max函式在編譯時被內聯展開
return 0;
}
2. 工作原理
-
概念:行內函數的目的是減少函式呼叫的開銷,透過在編譯時將函式體直接插入到每個呼叫點來實現。
-
特點:行內函數適用於簡單函式,因為複雜的函式體會導致程式碼體積增大。
行內函數是一種最佳化技術,適用於函式體簡單且呼叫頻繁的情況。使用行內函數可以減少函式呼叫的開銷,但需要謹慎使用,以避免程式碼體積過大。
3. 遞迴
- 概念:行內函數通常不用於遞迴,因為遞迴會導致函式體被多次插入,顯著增大程式碼體積。
- 特點:在遞迴呼叫中,行內函數的效果不如普通函式。
示例程式碼:
inline int recursiveFunction(int n) {
if (n == 0) return 1;
return n * recursiveFunction(n - 1); // 遞迴呼叫,不推薦使用內聯
}
int main() {
int result = recursiveFunction(5); // 可能導致程式碼膨脹
return 0;
}