今天在學習QT別人的項目時看到有個函數在聲明和調用時參數個數不一樣,查了下是c++中的一種函數類型,這個類型的函數可以讓代碼更簡潔、靈活。
-
定義:在函數聲明時,給某些參數預先設定一個默認值。調用函數時,如果省略這些參數,編譯器會自動使用默認值。
-
調用規則:從第一個默認參數開始,后續參數都可以省略(必須從左到右連續省略,不能跳過中間參數),默認參數放在函數聲明(頭文件)中
? 規則1:默認參數必須從右向左設置
// ? 正確:默認參數在右側 void func(int a, int b = 10, int c = 20);// ? 錯誤:中間參數不能跳過 void func(int a = 10, int b, int c);
? 規則2:默認參數在聲明中設置(頭文件)
通常放在函數聲明(頭文件)中,而非定義(源文件):
// header.h void printMessage(string msg, int times = 1);// source.cpp void printMessage(string msg, int times) {for (int i = 0; i < times; i++) cout << msg << endl; }
?? 注意:默認參數只能設置一次
避免在聲明和定義中重復設置:
// ? 錯誤:重復設置默認值 // header.h void foo(int x = 10);// source.cpp void foo(int x = 10) { ... } // 這里不能再寫默認值!
代碼示例
#include <iostream>
using namespace std;// 聲明函數時設置默認參數(半糖)
void orderMilkTea(string teaType, int sugarLevel = 50) {cout << "奶茶類型:" << teaType << ",甜度:" << sugarLevel << "%" << endl;
}int main() {orderMilkTea("珍珠奶茶"); // 不傳甜度,默認50%orderMilkTea("烏龍奶茶", 30); // 傳甜度30%return 0;
}
輸出:
奶茶類型:珍珠奶茶,甜度:50%
奶茶類型:烏龍奶茶,甜度:30%
編譯器在調用時會自動補全省略的參數。
使用默認參數的作用
-
減少重載函數:
不用為了不同參數組合寫多個重載函數。
// 不用寫兩個函數: // void drinkTea(string type); // void drinkTea(string type, int sugar);
-
提高可讀性:
調用時只需關注需要修改的參數。
-
兼容舊代碼:
給已有函數添加新參數時,舊代碼無需修改。
QT中這樣設計的好處
- 語法支持:C++標準允許函數參數設置默認值
- 實用需求:GUI操作中大多數參數通常不需要特殊設置
- API友好:降低簡單場景的使用復雜度,同時保留高級功能