今天在学习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友好:降低简单场景的使用复杂度,同时保留高级功能