C++:缺省参数

一、什么是缺省参数?

缺省参数(又称默认参数)是C++提供的一种函数特性,允许在函数声明时为参数指定一个默认值。当调用该函数时,如果没有提供对应的实参,编译器会自动使用这个默认值,缺省函数分为全缺省和半缺省函数。

1、全缺省

cpp 复制代码
#include <iostream>
using namespace std;

// 每个参数都指定了默认值,即为全缺省
void greet(string name = "Guest", string prefix = "Hello")
 {
    cout << prefix << ", " << name << "!" << endl;
}

int main() {
    greet();                     // 使用所有默认值:Hello, Guest!
    greet("Alice");              // 第二个参数用默认值:Hello, Alice!
    greet("Bob", "Hi");          // 全指定:Hi, Bob!
    
    return 0;
}

2、半缺省

cpp 复制代码
#include <iostream>
using namespace std;

// 只给部分参数指定默认值,即为半缺省
void greet(string name , string prefix = "Hello") {
    cout << prefix << ", " << name << "!" << endl;
}
  • 缺省参数让函数调用更加灵活,减少了不必要的函数重载,使代码更简洁。

二、基础规则

1、半缺省参数必须从右往左依次给缺省值,不能间隔跳越。
cpp 复制代码
void func(int a, int b = 1, int c = 2);   // 正确
void func(int a = 1, int b = 2, int c);   // 错误!最右边的c没有默认值,但左边却指定了
2、调用带缺省函数的函数时,必须从左到右依次给实参,不能间隔跳越。
3、函数声明和定义分开时,缺省参数只能在声明中出现,不能在定义中出现。
cpp 复制代码
// 函数声明(通常在头文件)
void print(int x, int y = 10);

// 函数定义(在源文件中)
void print(int x, int y) {
    cout << x << ", " << y << endl;
}
4、默认参数在编译时确定,其求值发生在调用点。因此,默认参数可以是常量、全局变量、函数调用,但不能是局部变量(因为局部变量在编译时不可知)。
cpp 复制代码
int global = 10;
int getDefault() { return 20; }

void example(int a = global, int b = getDefault()) 
{
    // 正确:全局变量和函数调用可以
}

void invalid()
{
    int local = 5;
    void func(int x = local);   // 错误!local不是编译时常量
}
5、默认参数和函数重载可以结合使用,但需小心避免歧义
cpp 复制代码
void display(int x) { cout << "int: " << x << endl; }
void display(int x, int y = 0) { cout << "two ints: " << x << ", " << y << endl; }

int main() {
    display(5);   // 歧义!编译器无法区分调用哪一个
    return 0;
}

三、缺省参数的优势

  • 减少函数重载数量:很多情况下,一个带默认参数的函数可以替代多个重载版本。

  • 增强代码可读性:调用时只需关注差异参数,无需重复写出所有参数。

  • 易于维护:增加新参数时,只需添加默认值,不影响已有调用。

相关推荐
南京兴帝文化传媒有限公司几秒前
本地生活服务商户GEO优化技术实践:AI大模型收录机制与地图POI权重算法拆解
大数据·人工智能·算法·生活·geo优化实操·csdn运营技巧·ai内容收录
佳児素花痴╮12 分钟前
Qt速通2
开发语言·qt
“AI国潮设计-小江”35 分钟前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁英歌舞猫IP & 创意甜品设计(附ComfyUI工作流与商业授权说明)
开发语言·人工智能·python·prompt·aigc
529宝宝起名网44 分钟前
用 Python 分析汉字字源与起名用字的关联规律:从六书结构到文化寓意的起名偏好洞察
开发语言·python
汉克老师1 小时前
CSP-J 初赛(以满分为目标):第三十九课《数学与逻辑②——阶乘、排列数与组合数:公式到底从哪里来?》
c++·csp-j·小学生·学c++编程
水饺编程1 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
linx2951 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6051 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
一只旭宝1 小时前
Python 与 C/C++ 内存模型对比总结
c语言·c++·python
心态还需努力呀1 小时前
把 Flameshot 编译进鸿蒙 PC:一次 Qt C++ 截图工具的源码级移植实战
c++·qt·harmonyos