C++学习第二十天 函数默认参数和占位参数

本文介绍了C++中函数默认参数的使用规则,包括如何设置默认值以及函数声明与实现时的注意事项。同时,讲解了函数的占位参数概念,指出占位参数必须在调用时填充。通过示例代码展示了这两种特性在实际编程中的应用。

1、函数默认参数

语法:返回值类型 函数名 (参数= 默认值){}

int func(int a, int b = 10, int c = 10) {
    return a + b + c;
}
 

1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
2. 如果函数声明有默认值,函数实现的时候就不能有默认参数 

int func2(int a = 10, int b = 10);
int func2(int a, int b) {
    return a + b;
}

int main() {

    cout << "ret = " << func(20, 20) << endl;
    cout << "ret = " << func(100) << endl;

    system("pause");

    return 0;
}

2、函数的占位参数

C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置

语法:返回值类型 函数名 (数据类型){}

//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int) {
	cout << "this is func" << endl;
}

int main() {

	func(10,10); //占位参数必须填补

	system("pause");

	return 0;
}


 

<think>我们正在讨论C++中的占位参数(placeholder parameters)概念。但是,请注意,在C++标准中并没有直接称为“占位参数”的术语。根据上下文,用户可能指的是以下几种情况之一: 1. 函数参数中的占位符(例如,在函数声明中省略参数名,只保留类型) 2. 模板编程中的占位符(如`auto`作为占位符类型,或者C++20引入的概念(concepts)中的占位符) 3. 与lambda表达式相关的占位符(如`std::placeholders::_1`等) 然而,根据用户提供的引用[1]中提到了“auto placeholder types”,引用[2]中提到了C++20概念(concepts)auto占位符,引用[3]与占位参数无关。因此,我们重点考虑以下两种可能: 可能性1:用户可能指的是在函数声明中省略参数名,只保留类型(即未命名参数)。例如: void func(int, int); // 两个未命名的参数,也就是占位参数 可能性2:用户可能指的是C++11中引入的占位符类型(如`auto`)或C++20中概念(concepts)的占位符。 由于用户的问题中同时出现了“placeholder parameters”“usage and explanation”,并且引用的文献中提到了C++20概念auto占位符,我们需要澄清。 但是,在C++中,更常见的“占位符”用法是在lambda表达式绑定器(bind)中,例如`std::placeholders::_1`。因此,我们考虑三种情况: 情况一:函数参数列表中的占位(未命名参数) 情况二:auto占位符类型(C++11起) 情况三:标准库中的占位符对象(如`_1, _2`,用于绑定参数) 由于用户没有明确说明,我们将分别解释这三种情况。 步骤1:解释函数声明中的未命名参数占位参数) 步骤2:解释auto作为占位符类型 步骤3:解释标准库中的占位符(std::placeholders) 同时,根据引用[2],C++20概念中的占位符(如概念约束的auto)也是重要的,所以我们也需要简要提及。 但是,请注意引用[2]是一道关于C++20概念的选择题,所以我们也可以参考它来介绍概念中的占位符。 因此,我们组织回答如下: 1. 函数声明中的占位参数(未命名参数2. auto类型占位符 3. C++20概念中的占位符(概念约束的auto) 4. 标准库中的占位符(std::placeholders) 由于用户的问题可能覆盖多个方面,我们将逐一解释。 下面开始回答:</think>### C++ 占位参数详解 在 C++ 中,"占位参数" 主要涉及三种不同场景,每种场景有不同的语法用途: #### 1. 函数声明中的未命名参数(传统占位参数) ```cpp void log(int, const char*); // 参数未命名,仅保留类型 ``` - **作用**:声明函数时省略参数名,表示这些参数函数实现中不会被使用 - **使用场景**: - 满足接口规范但无需实际使用参数 - 兼容旧代码的函数签名 - 避免未使用参数的编译器警告 - **注意事项**: - 函数定义时仍需命名参数才能访问 - C++17 支持 `[[maybe_unused]]` 属性替代 #### 2. 标准库占位符 (`std::placeholders`) ```cpp #include <functional> using namespace std::placeholders; // 引入 _1, _2, ... auto bound_func = std::bind(&Class::method, obj, _1, 42); // _1 表示调用时第一个参数的占位位置 ``` - **核心对象**:`_1`, `_2`, ..., `_N`(定义在 `<functional>` 中) - **作用**:标记参数位置用于延迟绑定 - **典型应用**: - 参数重排序:`bind(f, _2, _1)` 交换参数顺序 - 部分参数绑定:固定部分参数,留占位符供后续指定 - 回调函数适配 - **示例**: ```cpp void print(int x, int y) { std::cout << x << "," << y; } auto f = std::bind(print, _2, _1); f(10, 20); // 输出 "20,10"(参数顺序颠倒) ``` #### 3. C++20 概念约束中的占位符 ```cpp template <typename T> concept Addable = requires(T a, T b) { { a + b } -> std::convertible_to<T>; }; Addable auto add(Addable auto x, auto y) { return x + y; } ``` - **`auto` 作为类型占位符**: - 在概念约束中替代具体类型名 - 表示 "满足约束的任何类型" - **`requires` 子句**: ```cpp template <typename T> requires Addable<T> // 占位符约束 T sum(T a, T b); ``` - **优势**: - 替代复杂的 SFINAE 技术[^2] - 编译期类型检查更直观 - 提升模板错误信息可读性 ### 关键区别总结 | 特性 | 未命名参数 | `std::placeholders` | 概念约束占位符 | |--------------------|---------------------|------------------------|---------------------| | 所属标准 | C++98 | C++11 | C++20 | | 主要用途 | 忽略参数 | 参数绑定/重排序 | 模板类型约束 | | 语法 | `void f(int, int)` | `_1`, `_2` | `Concept auto` | | 是否保留类型信息 | 是 | 是 | 是 | | 典型应用场景 | 接口兼容 | 回调适配 | 模板元编程 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值