C/C++ 函数的默认参数

news2025/1/24 14:50:44

    下面介绍一项新内容 - 默认参数。

        默认参数指的是当函数调用中省略了实参时自动使用的一个值。
例如,如果将 void wow (int n)设置成n 有默认值为1,则函数调用 wow()相当于 wow(1)这极大地提高了使用函数的灵活性。

        假设有一个名为left()的函数,它将字符串和n作为参数,并返回该字符串的前n个字符。更准确地说,该函数返回一个指针,该指针指向由原始字符串中被选中的部分组成的字符串。

        例如,函数调用left(“theory”, 3)将创建新字符串“the”,并返回一个指向该字符串的指针。现在假设第二个参数的默认值被设置为1,则函数调用left(“theory”,3)仍像前面讲述的那样工作,3 将覆盖默认值。
        但函数调用left(“theory”)不会出错,它认为第二个参数的值为1,并返回指向字符串“t”的指针。
        如果程序经常需要抽取一个字符组成的字符串,而偶尔需要抽取较长的字符串,则这种默认值将很有帮助。

如何设置默认值呢?
        必须通过函数原型。由于编译器通过查看原型来了解函数所使用的参数数目,因此函数原型也必须将可能的默认参数告知程序。方法是将值赋给原型中的参数。
例如,left()的原型如下:

    char * left(const char * str,int n = 1);
    
        我们希望该函数返回一个新的字符串,因此将其类型设置为 char*(指向 char 的指针);
        我们希望原始字符串保持不变,因此对第一个参数使用了 onst 限定符;
        我们希望的默认值为 1,因此将这个值赋给 n。默认参数值是初始化值,因此上面的原型将 n初始化为1。如果省略参数n ,则它的值将为 1:否则,传递的值将覆盖 1。

        对于带参数列表的函数,必须从右向左添加默认值。也就是说,要为某个参数设置默认值,则必须为它右边的所有参数提供默认值:

int harpo(int n, int m = 4,int j= 5);        // 有效设置
int chico(int n,int m = 6,int j);            // 无效设置
int groucho(int k = 1,int m = 2,int n = 3); // 有效设置

例如,harpo()原型允许调用该函数时提供1个、2个或3个参数;

        beeps = harpo(2);       // 等同于harpo(2, 4, 5);
        beeps = harpo(1,8);        // 等同于harpo(1, 8, 5);
        beeps = harpo (8,7,6);     // 等同于harpo(8, 7, 6);
        
        实参按从左到右的顺序依次被赋给相应的形参,而不能跳过任何参数。因此,下面的调用是不允许的:
        beeps = harpo (3, ,8);     // 无效设置,并不能设置第二个参数为4
        
        默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式。在设计类时我们将发现,通过使用默认参数,可以减少要定义的析构函数、方法以及方法重载的数量。

        如下程序使用了默认参数。我们发现只有原型指定了默认值。函数定义与没有默认参数时完全相同。

示例源码:

// Len_left.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
const int ArSize = 80;
char* left(const char* str, int n = 1);
int main()
{
	char sample[ArSize]; 
	cout << "Enter a string:\n"; 
	cin.get(sample, ArSize); 
	char *ps = left(sample, 4); 
	cout << ps << endl; 
	delete[] ps; 
	
	ps = left(sample); 
	cout << ps << endl; 
	delete[] ps; 
	return 0;
}

char * left(const char * str, int n)
{
	if (n < 0)
	{
		n = 0;
	}
	char * p = new char[n + 1];
	int i = 0;
	for (i = 0; i < n && str[i]; i++)
	{
		p[i] = str[i];
	}
	while (i <= n)
	{
		p[i++] = '\0';
	}

	return p;
}

执行结果:

程序说明
        该程序使用 new创建一个新的字符串,以存储被选择的字符。一种可能出现的尴尬情况是,不合作的用户要求的字符数目可能为负。在这种情况下,函数将字符计数设置为 0,并返回一个空字符串。另一种可能出现的尴尬情况是,不负责任的用户要求的字符数目可能多于字符串包含的字符数,为预防这种情况函数使用了一个组合测试:
    
    i <n && str[i]
    
        i<n测试让循环复制了n个字符后终止。测试的第二部分一一表达式str[i],是要复制的字符的编码。遇到空值字符(其编码为0)后,循环将结束。这样,while循环将使字符串以空值字符结束,并将余下的空间(如果有的话)设置为空值字符。

        另一种设置新字符串长度的方法是,将 n 设置为传递的值和字符串长度中较小的一个:
    
        int len = strlen(str);
        n = (n <len) ? n : len;
        char *p =new char[n+1];

        这将确保new分配的空间不会多于存储字符串所需的空间。如果用户执行像 ("Hi", 3277)这样的调用,则这种方法很有用。第一种方法将把"Hi"复制到由32767 个字符组成的数组中,并将除前3 个字符之外的所有字符都设置为空值字符:第二种方法将"Hi!"复制到由4个字符组成的数组中。但由于添加了另外一个函数调用 (strlen()),因此程序将更长,运行速度将降低,同时还必须包含头文件 cstring(或string.h)。

        C程序员倾向于选择运行度更快更简洁的代码,因此需要程序员在正确使用函数方面承担更多责任。然而,C++的传统是更强调可靠性。毕竟,速度较慢但能正常运行的程序,要比运行速度虽快但无法正常运行的程序好。如果调用 strlcn()所需的时间很长,则可以让left()直接确定n和字符长度哪个小。

        例如,当m的值等于n或到达字符串结尾时,下面的循环都将终止:
        int m = 0;
        while(m <= n && str[m] != '\0')
             m++.
        char*P= new char [m+1];
        在str[m]不是空值字符时,表达式str[m]!='\0'的结果为true,否则为false。
由于在&&表达式非零值被转换为true,而零被转换为false,因此也可以这样编写这个while测试
    while (m<=n & str[m])

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Verilog] 加法器实现

1. 4位的加法器 先来一个最基本的的Verilog加法器 设计代码 module adder_4bit (input [3:0] a, b, output [3:0] sum, output carry);assign

arkts中@Watch监听的使用

概述 Watch用于监听状态变量的变化&#xff0c;当状态变量变化时&#xff0c;Watch的回调方法将被调用。Watch在ArkUI框架内部判断数值有无更新使用的是严格相等&#xff08;&#xff09;&#xff0c;遵循严格相等规范。当在严格相等为false的情况下&#xff0c;就会触发Watch的…

2024年【安全员-A证】考试内容及安全员-A证最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证考试内容参考答案及安全员-A证考试试题解析是安全生产模拟考试一点通题库老师及安全员-A证操作证已考过的学员汇总&#xff0c;相对有效帮助安全员-A证最新解析学员顺利通过考试。 1、【多选题】下列关于门…

Python序列之集合

系列文章目录 Python序列之列表Python序列之元组Python序列之字典Python序列之集合&#xff08;本篇文章&#xff09; Python序列之集合 系列文章目录前言一、集合是什么&#xff1f;二、集合的操作1.集合的创建&#xff08;1&#xff09;使用{}创建&#xff08;2&#xff09;…

全渠道客服系统推荐:选型指南与最佳实践分享

售后服务是影响客户满意度的最直接的因素。有些企业不注重产品的售后服务&#xff0c;不仅是对客户的伤害&#xff0c;更是对企业品牌的损害。所以&#xff0c;做好售后服务对于企业来讲至关重要。 企业谈到做好售后服务&#xff0c;少不了一款好用的客服系统工具。其中&#…

9年900亿:印钞机Tether想搞大模型

作者&#xff1a;Daniel KuhnConsensus Magazine 编译&#xff1a;秦晋 碳链价值 在经历有望盈利45亿美元辉煌的一年之后&#xff0c;这位新晋升的Tether首席执行官正寻求实现公司投资的多元化。 加密货币行业受过教育或具有影响力的精英们的「明智看法」是&#xff0c;世界上最…

【零基础入门VUE】VueJS - 模板

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门VUE专栏https://blog.csdn.net/arthas777/category_12537076.html 我们在前面的章节中学习了如何在屏幕上以文本内容的形式输出。在本章中&#xff0c;我们将学习如何在屏幕上以 HTML 模板的形式获取输出。 为了…

Generalized Focal Loss V1论文解读

摘要 单级检测器基本上将物体检测表述为密集分类和定位&#xff08;即边界框回归&#xff09;。分类通常通过Focal Loss进行优化&#xff0c;而边界框的定位通常根据Dirac delta分布进行学习。单级检测器的最新趋势是引入一个单独的预测分支来估计定位质量&#xff0c;预测质量…

华清远见作业第十六天

思维导图&#xff1a; 双向循环链表头插入&#xff1a; 代码&#xff1a; Doublelist insert_head(Doublelist head,datatype element) {//创建新节点sDoublelist screate_node();if(NULLs){return head;}s->dataelement;//数据存储//判断链表是否为空if(NULLhead){heads;…

CCSK认证:开启云安全领域的黄金大门

&#x1f31f;你是否对云安全领域充满热情&#xff1f;是否希望提升自己在云安全领域的专业性和竞争力&#xff1f;CCSK认证是你的不二之选&#xff01; &#x1f525;CCSK简介&#xff1a; CCSK是国际云安全联盟&#xff08;Cloud Security Alliance&#xff0c;CSA&#xff…

OCP NVME SSD规范解读-2.复位与控制器配置要求-part2

Maximum Data Transfer Size (MDTS)&#xff1a;设备应支持至少256KB的最大数据传输大小。 CSTS.CFS Reporting: 设备固件应支持报告CSTS.CFS&#xff08;Controller Status and Capabilities Field in the Status Register&#xff09;。 Queue Depths: 每个提交队列的SQ最小…

ESP32入门七(中断)

中断用于处理在程序正常执行期间通过外部事件或者响应软件指令触发时发生的事件。比如&#xff0c;在一段呼吸灯的代码中&#xff0c;正常运行时的结果为LED从暗到亮&#xff0c;再从亮到暗持续地运行。我们可以通过一个中断来控制呼吸灯的运行和停止。使用中断功能&#xff0c…

Linux操作系统( YUM软件仓库技术 )

镜像文件的回环挂载&#xff08;把iso镜像文件释放成系统安装光盘&#xff09;foundation0上操作 回环挂载的用法&#xff1a; du -sh 对象名 //估算文件&#xff08;一切对象皆文件&#xff09;大小 !$ //上一条命令的最后一个参数 新创建的挂载点目录是空白目录 挂载&#xf…

移动端开发框架mui代码在安卓模拟器上运行(HbuilderX连接到模拟器)

开发工具 HBuilder X 3.8.12.20230817 注意&#xff1a;开发工具尽量用最新的或较新的。太旧的版本在开发调试过程中可能会出现莫名其妙的问题。 1、电脑下载安装安卓模拟器 我这里使用的是 夜神模拟器 &#xff0c;也可以选择其他安卓模拟器 夜神模拟器官网&#xff1a;夜神安…

Python教程(19)——python异常处理

异常处理 什么是异常异常处理方式try-except语句捕获异常类型 相关的异常类型 什么是异常 在计算机编程中&#xff0c;异常&#xff08;Exception&#xff09;是指在程序执行过程中发生的错误或异常情况。当出现异常时&#xff0c;程序无法正常继续执行&#xff0c;因此需要采…

【linux】tail的基本使用

在linux可以用find查找一个文件&#xff0c;可以用grep查找符合要求的文件内容&#xff0c;但是有的时候希望查看文件的前几行或者后几行&#xff08;其实这种场景经常可以遇到&#xff0c;比如接触到日志分析的时候&#xff09;&#xff0c;那就应该使用head和tail这两个工具了…

亲爱的程序猿们,元旦快乐!

新年祝福 在这个充满欢笑和祝福的日子里&#xff0c;我想对你们说&#xff1a; 新的一年&#xff0c;愿你们像代码一样充满逻辑&#xff0c;像算法一样追求高效&#xff0c;像编程语言一样多样化&#xff01; 2024年即将到来&#xff0c;预测几个行业趋势&#xff1a; 人工…

SpringBoot+拦截器(Interceptor)

记录一下SpringBoot的拦截器(Interceptor)使用 拦截器(Interceptor)是AOP面向切面编程的思想来实现的&#xff0c;对于只写代码的来说&#xff0c;具体如何实现不需要多关心&#xff0c;只需要关心如何去使用&#xff0c;会用在那些地方。 当http请求进入Springboot应用程序后…

第一部分 随机事件和概率

目录 无放回题目(一次摸多个) 方法&#xff1a; 例1 有放回题目(进行多次&#xff0c;每次情况一致) 方法&#xff1a; 例2 事件的概率 方法&#xff1a; 例3 条件概率 方法&#xff1a; 例4 全概率公式 方法&#xff1a; 例5 贝叶斯公式 方法&#xff1a; 例6 无放回题目(…

方太厨电,在创新科技中看见烟火人间

人类的历史&#xff0c;就是一部创新的历史。科普作者马特里德利在《创新的起源&#xff1a;一部科学技术进步史》写道&#xff1a;能源是所有创新之源。 火的发明和使用&#xff0c;就是一种创新&#xff0c;人类第一次通过控制热量的转换来做功&#xff0c;依靠火来取暖和烹饪…