C++ 默认参数:彻底搞懂引用默认参数的核心用法

C++ 默认参数:彻底搞懂引用默认参数的核心用法 在 C 的函数语法中默认参数Default Arguments是一个实用性拉满的特性它能大幅简化函数调用、减少重载函数的冗余代码也是新手入门必须掌握的基础知识点。很多人写代码时会遇到同一个函数大部分调用场景都用固定值只有少数场景需要自定义参数 —— 默认参数就是为解决这个问题而生。这篇博客用通俗的语言 实战案例带你从零学会默认参数避开所有坑点。一、什么是默认参数1. 核心定义默认参数声明函数时为形参预先指定一个默认值。调用函数时如果不传入该参数函数会自动使用预设的默认值如果传入参数则优先使用传入的值。简单理解给函数参数一个 “备用选项”不传就用默认值传了就覆盖默认值。2. 基础语法// 函数声明为后面的形参赋值默认值 返回值类型 函数名(参数1, 参数2 默认值, 参数3 默认值...) { 函数体 }3. 最简单示例#include iostream using namespace std; // 打印数字给参数num设置默认值100 void printNum(int num 100) { cout 数字 num endl; } int main() { // 不传参 → 使用默认值100 printNum(); // 传参 → 覆盖默认值输出666 printNum(666); return 0; }二、默认参数的黄金规则必记默认参数不是随便写的必须遵守2 条核心规则否则直接编译报错规则 1默认参数必须从右往左连续设置这是最容易踩坑的点默认参数只能放在参数列表右侧不能中间穿插、左边设置默认右边不设置。// 从右往左参数2、3有默认值 void test(int a, int b 20, int c 30) {} // 全部参数都有默认值 void test2(int a 10, int b 20) {}规则 2默认参数只能在声明中指定声明和定义分离时如果函数声明和定义分开比如头文件声明、源文件实现默认参数只能写在声明处定义处不能重复写否则会报 “重定义默认参数” 错误。// 函数声明写默认参数 void showInfo(string name, int age 18); // 函数定义不写默认参数 void showInfo(string name, int age) { cout name age 岁 endl; }三、默认参数的 3 大实用场景默认参数不是语法糖而是能简化代码、提升可读性的核心特性常用在这 3 个场景场景 1简化重复调用最常用当函数大部分调用都用相同参数时不用每次重复传参。比如打印日志默认等级为普通日志特殊情况才指定等级。// 日志函数默认等级1 void log(string msg, int level 1) { cout [等级 level ] msg endl; } int main() { // 普通日志不用传等级 log(程序启动成功); // 警告日志传等级2 log(内存占用过高, 2); return 0; }场景 2替代函数重载不用写多个重载函数一个默认参数就能兼容多种调用方式。比如计算矩形面积支持正方形只传边长和长方形传长和宽。// 一个函数搞定两种调用 int calcArea(int a, int b -1) { // 只传一个参数正方形 if(b -1) return a * a; // 传两个参数长方形 return a * b; } int main() { cout 正方形面积 calcArea(5) endl; // 25 cout 长方形面积 calcArea(4, 6) endl; // 24 return 0; }场景 3类构造函数初始化在 C 类中构造函数用默认参数能创建多种初始化方式减少构造函数重载。class Student { public: // 构造函数姓名默认未知年龄默认18 Student(string name 未知, int age 18) { this-name name; this-age age; } void show() { cout name age 岁 endl; } private: string name; int age; }; int main() { Student s1; // 全默认 Student s2(张三); // 只传姓名 Student s3(李四, 20);// 传全部参数 s1.show(); s2.show(); s3.show(); return 0; }四、新手必避的 4 个坑1.默认参数不能和函数重载冲突如果同时写重载函数和默认参数编译器会分不清调用哪个导致歧义。// 歧义代码调用test()时编译器不知道选哪个 void test() {} void test(int a 10) {}2.默认参数值不能是函数的局部变量默认参数的值必须是全局变量 / 常量不能用函数内的局部变量。void test() { int a 10; // 错误局部变量不能做默认参数 void func(int x a); }3.指针 / 引用也能做默认参数指针默认值常用nullptr引用默认值必须是合法变量。// 指针默认参数 void testPtr(int* p nullptr) {} // 引用默认参数 int num 100; void testRef(int n num) {}4.默认参数是编译期确定默认参数的值在编译时就固定了不是运行时动态计算五、默认参数 VS 函数重载特性默认参数函数重载代码量极少一个函数搞定多需要写多个函数灵活性适合参数差异小的场景适合逻辑完全不同的场景调用方式简洁无需区分函数名需匹配参数个数 / 类型适用场景通用、重复调用的函数功能不同但同名的函数一句话建议参数逻辑一致、只是值不同 → 用默认参数功能逻辑不同 → 用重载。六、总结什么时候用默认参数函数大部分调用都用固定参数值→ 用默认参数想减少重载函数简化代码 → 用默认参数类构造函数需要多种初始化方式→ 用默认参数工具函数、通用函数日志、打印、计算→ 优先用默认参数