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

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

        默认参数指的是当函数调用中省略了实参时自动使用的一个值。
例如,如果将 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])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

构建安全的SSH服务体系

某公司的电子商务站点由专门的网站管理员进行配置和维护&#xff0c;并需要随时从Internet进行远程管理&#xff0c;考虑到易用性和灵活性&#xff0c;在Web服务器上启用OpenSSH服务&#xff0c;同时基于安全性考虑&#xff0c;需要对 SSH登录进行严格的控制&#xff0c;如图10…

记一次JSF异步调用引起的接口可用率降低 | 京东云技术团队

前言 本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程&#xff0c;主要介绍了排查思路和JSF异步调用的流程&#xff0c;希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF 1,7.5-HOTFIX-T6版本。 起因 问题背景…

【MATLAB】【数字信号处理】基本信号的仿真与实现

目的 1、用MATLAB软件实现冲激序列 2、用MATLAB软件实现阶跃序列 3、用MATLAB软件实现指数序列 4、用MATLAB软件实现正弦序列 内容与测试结果 1、用MATLAB软件实现冲激序列 程序如下&#xff1a; % 1 冲激序列 clc; clear all; n0 -10; nf 50; ns 1; A 1;%起点为-1&…

SpringBoot灵活集成多数据源(定制版)

如来说世界&#xff0c;非世界&#xff0c;是名世界 如来说目录&#xff0c;非目录&#xff0c;是名目录 前言前期准备代码实现演示扩展 前言 本篇博客基于SpringBoot整合MyBatis-plus&#xff0c;如果有不懂这个的&#xff0c; 可以查看我的这篇博客&#xff1a;快速CRUD的秘诀…

Linux 权限掌控术:深入探索和用户管理

文章目录 前言1.外壳程序是什么&#xff1f;外壳程为什么存在&#xff1f;工作原理外壳程序怎么个事&#xff1f; 2. Linux权限的概念2.1 什么是权限2.2权限的本质2.3 Linux中的用户 3. 普通用户变成rootlinux中有三种人 4.Linux中文件的权限4.1文件的属性权限4.2 掌握修改权限…

数字集成系统设计——逻辑综合

目录 一、概述 1.1 综合的分类 1.2 逻辑综合的基本架构 1.3 逻辑综合的内部流程 1.3.1 RTL代码转译&#xff08;Translation&#xff09; 1.3.2 逻辑级优化&#xff08;Optimization&#xff09; 1.3.3 工艺映射&#xff08;Mapping&#xff09; 二、优化策略 2.1 资源…

Linux之进程管理

什么是进程 在linux中每个执行的程序都称为一个进程&#xff0c;每个进程都分配一个ID号&#xff08;pid进程号&#xff09;。每个进程都可能以两种方式存在&#xff0c;即前台和后天。前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作&#xff0c;但屏幕…

AD教程 (二十一)模块化布局规划

AD教程 &#xff08;二十一&#xff09;模块化布局规划 原理图是按照我们的功能模块去进行排布划分的 利用交叉选择模式分屏快速进行模块化布局 分屏&#xff0c;选中任意文档&#xff0c;右击&#xff0c;点击垂直分割 交叉选择模式&#xff0c;点击工具&#xff0c;交叉选…

【模拟电路】软件Circuit JS

一、模拟电路软件Circuit JS 二、Circuit JS软件配置 三、Circuit JS 软件 常见的快捷键 四、Circuit JS软件基础使用 五、Circuit JS软件使用讲解 欧姆定律电阻的串联和并联电容器的充放电过程电感器和实现理想超导的概念电容阻止电压的突变&#xff0c;电感阻止电流的突变LR…

基于SpringBoot的校园二手闲置交易平台

基于SpringBoot的校园二手闲置交易平台的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 摘要 本文基于Spring Boot框架设计并实现了一款…

buuctf-Misc 题目解答分解103-105

103.[GKCTF 2021]签到 追踪流发现类似flag 字符 f14g 下面有大量的是16进制字符 64306c455357644251306c6e51554e4a5a3046355355737764306c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e655…

git rebase应用场景三

文章目录 git rebase应用场景三 git rebase应用场景三 在我们的开发分支中 假设我们修改一个文件 提交一个版本 再回到master分支 同时也去修改1.txt文件&#xff0c;提交一个版本 这样相当于master分支提交了一次&#xff0c;dev也提交了一次 然后回到dev分支 此时会报错…

【网络安全】upload靶场pass11-17思路

目录 Pass-11 Pass-12 Pass-13 Pass-14 Pass-15 Pass-16 Pass-17 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x…

gRPC之内置Trace

1、内置Trace grpc内置了客户端和服务端的请求追踪&#xff0c;基于golang.org/x/net/trace包实现&#xff0c;默认是开启状态&#xff0c;可以查看事 件和请求日志&#xff0c;对于基本的请求状态查看调试也是很有帮助的&#xff0c;客户端与服务端基本一致&#xff0c;这里…

Delphi6函数大全4-SysUtils.pas

Delphi6函数大全4-SysUtils.pas首部 function FormatFloat(const Format: string; Value: Extended): string; $[SysUtils.pas功能 返回浮点数类型以指定格式字符串Format转换成字符串说明 FormatFloat(,.00, 1234567890) 1,234,567,890.00参考 function …

element表格排序功能

官方展示 个人项目 可以分别对每一项数据进行筛选 注&#xff1a;筛选的数据不能是字符串类型必须是数字类型&#xff0c;否则筛选会乱排序 html <el-table :data"tableData" border height"600" style"width: 100%"><el-table-co…

实验六——cache模拟器实验

前言 本次实验的主要目的是熟悉cache的原理。加深对cache的映像规则、替换方法、cache命中与缺失的理解。通过实验对比分析映像规则对cache性能的影响。 实验内容一&#xff1a;熟悉模拟程序 阅读给出的cache模拟程序&#xff08;cachesimulator.cpp&#xff09;&#xff0c;…

Linux学习之系统编程1(关于读写系统函数)

写在前面&#xff1a; 我的Linux的学习之路非常坎坷。第一次学习Linux是在大一下的开学没多久&#xff0c;结果因为不会安装VMware就无疾而终了&#xff0c;可以说是没开始就失败了。第二次学习Linux是在大一下快放暑假&#xff08;那个时候刚刚过完考试周&#xff09;&#xf…

基于Java在线商城系统设计实现(源码+部署文档+讲解视频)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌&#x1f345; 文末获取源码联系 &#x1f345;&#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

目标检测-Two Stage-Mask RCNN

文章目录 前言一、Mask RCNN的网络结构和流程二、Mask RCNN的创新点总结 前言 前文目标检测-Two Stage-Faster RCNN提到了Faster RCNN主要缺点是&#xff1a; ROI Pooling有两次量化操作&#xff0c;会引入误差影响精度 Mask RCNN针对这一缺点做了改进&#xff0c;此外Mask …