C++从入门到精通——缺省参数

缺省参数

  • 前言
  • 一、缺省参数概念
  • 二、缺省参数分类
    • 位置参数的缺省参数
      • 全缺省参数
      • 半缺省参数
    • 关键字参数的缺省参数
    • 函数指针的缺省参数
      • `lambda`表达式
  • 三、缺省参数的具体代码展示
    • main.cpp


前言

缺省参数是在函数定义时指定的默认值,当调用函数时未提供该参数的值时,将使用缺省值。使用缺省参数可以简化函数调用,提高代码可读性。但需注意,过多使用缺省参数可能导致代码难以理解和维护。


一、缺省参数概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。这种机制允许函数在更广泛的情境下被调用,提高了代码的灵活性和可重用性。

在许多编程语言中,如Python、Java和C++等,都支持缺省参数的概念。下文将以C++为例,通过在函数定义时为某些参数指定默认值,就可以创建出可以接受可变数量参数的函数。这样,当调用者只提供了部分参数时,函数依然可以正确地执行,而那些没有提供值的参数则会使用默认值。

这种设计不仅方便了开发者,也使得代码更加易于理解和维护。因为当函数有多个参数时,如果每个参数都必须明确提供,那么调用者就需要记住每个参数的意义和顺序,这无疑增加了出错的概率。而有了缺省参数,即使调用者忘记了某个参数的值,函数也能正常工作,只是使用了预设的默认值而已。

此外,缺省参数还有助于实现函数的重载。在某些语言中,虽然不直接支持函数重载(即多个同名函数,但参数列表不同),但可以通过结合缺省参数和可变参数来实现类似的效果。这样,就可以根据调用者提供的参数数量和类型,执行不同的函数逻辑。

ps:关于函数重载,我将在下篇文章详细讲解

然而,虽然缺省参数带来了很多便利,但使用时也需要谨慎。过多的缺省参数可能导致函数的行为变得难以预测,因为调用者可能不清楚哪些参数使用了默认值,哪些参数是明确提供的。因此,在设计函数时,应该合理地选择哪些参数应该有默认值,哪些参数应该是必须的。

#include<iostream>
using namespace std;
void Func(int a = 0)
{cout << a << endl;
}
int main()
{Func();     // 没有传参时,使用参数的默认值Func(10);   // 传参时,使用指定的实参return 0;
}

在这里插入图片描述

二、缺省参数分类

缺省参数分类是程序设计中常见的一种参数设置方式。它允许在函数调用时省略某些参数,这些参数会使用预设的默认值。缺省参数可以分为两类:位置缺省参数和关键字缺省参数。位置缺省参数根据函数参数列表中的顺序确定默认值,而关键字缺省参数则通过指定参数名来设置默认值。这种分类方式有助于简化函数调用,提高代码的可读性和灵活性。

在 C++ 中可以分为以下几种类型:

位置参数的缺省参数

全缺省参数

void Func(int a = 10, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

在这里插入图片描述

半缺省参数

void Func(int a, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

在这里插入图片描述

如果参数不够就会报错
在这里插入图片描述

注意

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现
//a.hvoid Func(int a = 10);// a.cppvoid Func(int a = 20){}// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用哪个缺省值。
  1. 缺省值必须是常量或者全局变量
  2. C语言不支持(编译器不支持)

关键字参数的缺省参数

在函数的参数列表中使用关键字参数,并为其设置默认值。调用函数时可以不传入这些参数,而是使用默认值。

void greet(string name, string message = "Hello") {  // message 是缺省参数,设定默认值为 "Hello"cout << message << ", " << name << endl;
}greet("Alice");  // 输出 "Hello, Alice"
greet("Bob", "Good morning");  // 输出 "Good morning, Bob"

在这里插入图片描述

函数指针的缺省参数

对于C++函数指针不理解的地方,可看作者的后续文章

在函数的参数列表中可以设置一个函数指针作为参数,并为其设置默认值。

void printNumber(int num) {cout << num << endl;
}void processNumber(int num, void (*func)(int) = printNumber) {func(num);
}processNumber(123);  // 输出 123
processNumber(456, [](int num) { cout << "Number: " << num << endl; });  // 输出 "Number: 456"

关于

processNumber(456, [](int num) { cout << "Number: " << num << endl; });  // 输出 "Number: 456"

这段代码定义了一个名为processNumber的函数,该函数有两个参数:一个整数num和一个函数指针。函数指针指向一个没有返回值的函数,该函数接受一个整数作为参数,并在函数体内打印出该整数。

 [](int num) { cout << "Number: " << num << endl; }

上述代码是个空函数,后面大括号里的是这个空函数里的代码,只不过是放在同一排上,正常应如下,这种叫lambda表达式,可以按照我说的方式来理解

{cout << "Number: " << num << endl; 
}

当调用processNumber函数时,传入的第一个参数是456,第二个参数是一个lambda表达式,这个lambda表达式定义了一个匿名函数,其参数为一个整数num,函数体内打印出"Number: "加上num的值,然后换行。

因此,调用processNumber(456, [](int num) { cout << "Number: " << num << endl; });的结果将是打印出"Number: 456"
在这里插入图片描述

需要注意的是,在 C++ 中,缺省参数只能从右到左连续出现,即在参数列表中,缺省参数必须位于非缺省参数的右侧。

lambda表达式

在C++中,lambda表达式被用于创建匿名函数。它的语法与其他编程语言中的lambda表达式相似。

在C++中,lambda表达式的语法为:

[capture list](parameters) -> return_type {// 函数体
}

其中,capture list是可选的,用于捕获外部变量,可以是空的或包含一个或多个外部变量。parameters是函数的参数列表,可以为空。return_type是函数的返回类型,可以省略或使用auto自动推导。

下面是一个示例,使用lambda表达式定义一个函数,打印输入的数字:

void processNumber(int num, const std::function<void(int)>& callback) {callback(num);
}int main() {int num = 456;processNumber(num, [](int num) { std::cout << "Number: " << num << std::endl; });return 0;
}

在上面的示例中,processNumber函数接受一个数字和一个callback函数作为参数。callback是一个std::function类型,其中的参数为int类型。在main函数中,我们使用lambda表达式作为回调函数,打印输入的数字。

三、缺省参数的具体代码展示

main.cpp

#include<iostream>
using namespace std;
//void Func(int a = 0)
//{
//	cout << a << endl;
//}//void Func(int a = 10, int b = 20, int c = 30)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl;
//}
void Func(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
void greet(string name, string message = "Hello") {  // message 是缺省参数,设定默认值为 "Hello"cout << message << ", " << name << endl;
}
void printNumber(int num) {cout << num << endl;
}void processNumber(int num, void (*func)(int) = printNumber) {func(num);
}int main()
{//Func();     // 没有传参时,使用参数的默认值//Func(10);   // 传参时,使用指定的实参//Func();/*Func(60);Func(50,100);*///greet("Alice");  // 输出 "Hello, Alice"//greet("Bob", "Good morning");  // 输出 "Good morning, Bob"processNumber(123);  // 输出 123processNumber(456, [](int num) { cout << "Number: " << num << endl; });  // 输出 "Number: 456"return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/576994.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android Handler】从源码出发,一步步窥探Handler在Java层的数据结构关系和执行原理

文章目录 Example for useLooperHandler sendMessagemsg插入链表头Message p mMessages;msg.next p;mMessages msg; msg插入链表中间Message p mMessages;prev p;p p.next;msg.next p;prev.next msg; LooperpreparelooploopOncelooper和message的关系next message和han…

修改 RabbitMQ 默认超时时间

MQ客户端正常运行&#xff0c;突然就报连接错误&#xff0c; 错误信息写的很明确&#xff0c;是客户端连接超时。 不过很疑虑&#xff0c;为什么会出现连接超时呢&#xff1f;代码没动过&#xff0c;网络也ok&#xff0c;也设置了心跳和重连机制。 最终在官网中找到了答案&am…

AIGC重塑金融 | 大模型在金融行业的应用场景和落地路径

作者&#xff1a;林建明 来源&#xff1a;IT阅读排行榜 本文摘编自《AIGC重塑金融&#xff1a;AI大模型驱动的金融变革与实践》&#xff0c;机械工业出版社出版 目录 01 大模型在金融领域的 5 个典型应用场景 02 大模型在金融领域应用所面临的风险及其防范 03 AIGC 技术的科…

SAP gui 组服务器 提示 Error service sapmsPRD unknown

/etc/hosts 追加IP地址和域名的配对关系 /etc/services 追加 sapms[sid] 3601/tcp

ctf-36C3解析

一、环境 unbentu 这道题给了docker环境&#xff0c;gethub上面自己找 一个好用的linux全局切换梯子proxychains 二、开始解析 2.1初始 2.2编译 docker build . 2.3代理设置完毕 我试了一下代理还是不行&#xff0c;我们换源尝试一下 RUN sed -i s/deb.debian.org/mirro…

7 AOP事务管理

文章目录 6.1 Spring事务简介6.1.1 相关概念介绍6.1.2 转账案例-需求分析6.1.3 转账案例-环境搭建步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步骤7:创建JdbcConfig配置类步…

element plus的el-image图片发布到nginx不显示

问题&#xff1a; <el-image alt""src"/img/month-b.png" class"card-icon"style"width: 89px;height: 89px;right: -7px;top: -5px;"/> 部署到nginx二级路由访问地址是&#xff1a; http://192.168.1.207/divided/# 这时候使用…

R语言赋值符号<-、=、->、<<-、->>的使用与区别

R语言的赋值符号有&#xff1c;-、、-&#xff1e;、&#xff1c;&#xff1c;-、-&#xff1e;&#xff1e;六种&#xff0c;它们的使用与区别如下: <-’&#xff1a;最常用的赋值符号。它将右侧表达式的值赋给左侧的变量&#xff0c;像一个向左的箭头。例如&#xff0c;x …

EasyExcel 复杂表头的导出(动态表头和静态表头)

问题&#xff1a;如图&#xff0c;1部分的表头是动态的根据日期变化&#xff0c;2部分是数据库对应的字段&#xff0c;静态不变的&#xff1b; 解决方案&#xff1a;如果不看1的部分&#xff0c;2部分内容可以根据实体类注解的方式导出&#xff0c;那么我们是不是可以先将动态表…

UKP3d,AutoPDMS出轴测图时的焊点设置

焊点的设置是关联元件库里的连接方式&#xff08;焊点设置不成功&#xff0c;请查看元件的连接方式&#xff09;&#xff0c;看元件的连接方式如下&#xff1a; 转到两次查看元件连接类型

蓝桥杯23年第十四届省赛真题-三国游戏|贪心,sort函数排序

题目链接&#xff1a; 1.三国游戏 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2023年第十四届省赛真题-三国游戏 - C语言网 (dotcpp.com) 虽然这道题不难&#xff0c;很容易想到&#xff0c;但是这个视频的思路理得很清楚&#xff1a; [蓝桥杯]真题讲解&#xff1a;三国游戏&#xff0…

计算机网络——数据链路层(差错控制)

计算机网络——数据链路层&#xff08;差错控制&#xff09; 差错从何而来数据链路层的差错控制检错编码奇偶校验码循环冗余校验&#xff08;CRC&#xff09;FCS 纠错编码海明码海明距离纠错流程确定校验码的位数r确定校验码和数据位置 求出校验码的值检错并纠错 我们今年天来继…