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])

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

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

相关文章

SpringIOC之ApplicationObjectSupport

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

pytorch与cuda版本对应关系汇总

pytorch与cuda版本关系 cuda版本支持pytorch版本cuda10.21.5 ~ 1.12cuda11.01.7 ~ 1.7.1cuda11.11.8 ~ 1.10.1cuda11.31.8.1 ~ 1.12.1cuda11.61.12.0 ~ 1.13.1cuda11.71.13.0 ~ 2.0.1cuda11.82.0.0 ~ 2.1.1cuda12.12.1.0 ~ 2.1.1 cuda 与 cudnn关系 cuda版本支持cudnn版本cu…

微信小程序:跳转页面

实际调用需要根据自己业务实际情况决定&#xff0c;虽然各种方式一定程度上能减少内存损耗&#xff0c;但是业务上面流转优化才是最终要满足的&#xff0c;一定要从业务流转去优化去考虑&#xff0c;不要为了性能增加了流转复杂度 1、wx.navigateTo 保留当前页面&#xff0c;跳…

12、defer

defer defer意思是推迟、延迟。语法很简单&#xff0c;就在正常的语句前加上defer就可以了。 ​ 在某函数中使用defer语句&#xff0c;会使得defer后跟的语句进行延迟处理&#xff0c;当该函数即将返回时&#xff0c;或发生panic时&#xff0c;defer后语句开始执行。注意os.E…

算法基础之最短Hamilton路径

最短Hamilton路径 核心思想&#xff1a; 数位dp 用二进制数 存当前所有点 遍历过为1 遍历i图中j点 若j点走过 则求j点路径长度 f[state][j] f[state_k][k] w[k][j] state为除去j点的图 #include<iostream>#include<cstring>#include<algorithm>using n…

java web开发

什么是javaEE javaEE是企业版 是一个web开发平台 规范了web技术标准 技术有 JDBC JSP XML Servlet 硬件服务器&#xff1a;和pc一样属于计算机 软件服务器&#xff1a;文件服务器 数据库服务器 应用服务器java EE 应用服务器 是收费的 实现了EE技术 web 服务器 实现了部分技…

<JavaEE> TCP 的通信机制(一) -- 确认应答 和 超时重传

目录 TCP的通信机制的核心特性 一、确认应答 1&#xff09;什么是确认应答&#xff1f; 2&#xff09;如何“确认”&#xff1f; 3&#xff09;如何“应答”&#xff1f; 二、超时重传 1&#xff09;丢包的概念 2&#xff09;什么是超时重传&#xff1f; 3&#xff09…

详解信道容量,信道速率,安全速率的区别

目录 一. 信道容量与信道速率 二. 小结 三. 安全速率与物理层安全 3.1 香农物理层安全模型 3.2 安全信道速率 四. 补充安全中断概率&#xff08;Secrecy Outage Probability, SOP&#xff09; 五. 补充安全分集度&#xff08;Secrecy Diversity Order, SDO&#xff09; …

如何通过 useMemo 和 useCallback 提升你的 React 应用性能

背景 在 React 中&#xff0c;useMemo 和 useCallback 这两个 hook 是我们优化应用性能的有力工具。它们会返回 memoized 版本的值或函数&#xff0c;只在依赖项发生变化时才进行重新计算或定义。 Hook 介绍 useMemo useMemo 的作用是返回一个 memoized 值&#xff0c;它接…

AAAI 2024 | 用逆向思维图(ReX-GoT)进行多选对话常识推理

©PaperWeekly 原创 作者 | 郑理 单位 | 武汉大学硕士生 研究方向 | 自然语言处理 论文题目&#xff1a; Reverse Multi-Choice Dialogue Commonsense Inference with Graph-of-Thought 论文作者&#xff1a; 郑理&#xff0c;费豪&#xff0c;李霏&#xff0c;李波波&am…

EI级 | Matlab实现TCN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.【EI级】 Matlab实现TCN-BiGRU-Mult…

【数据分析】数据分析方法|市场细分与同期群分析

【数据分析】数据分析方法|市场细分与同期群分析 数据分析的目的总的来说只有两个&#xff1a;一个是证伪(或证实)&#xff1b;另一个是推理。证伪是为了确认过程的正确性&#xff0c;这个过程通常是一项具体的业务&#xff1b;推理是为了找到某种确实的逻辑&#xff0c;比如某…

2023年03月09日_谷歌视觉语言模型PaLM-E的介绍

自从最近微软凭借OpenAI 和ChatGPT火了一把之后呢 老对手Google就总想着扳回一局 之前发布了硬刚ChatGPT的Bard 但是没想到翻车了 弄巧成拙 所以呢Google这一周又发了个大招 发布了史上最大的视觉语言模型PaLM-E 这个模型有多夸张呢 参数量高达5,620亿 是ChatGTP-3的三…

爬虫工作量由小到大的思维转变---<第二十六章 Scrapy通一通中间件的问题>

前言: 准备迈入scrapy-redis或者是scrapyd的领域进行一番吹牛~ 忽然想到,遗漏了中间件这个环节! 讲吧~太广泛了;不讲吧,又觉得有遗漏...所以,本章浅谈中间件; (有问题,欢迎私信! 我写文告诉你解法) 正文: 当我们谈到 Scrapy 的中间件时&#xff0c;可以将其比作一个特殊的助…

Python使用PyMySql增删改查Mysql数据库

PyMysql简介 PyMysql是Python中用于连接MySQL数据库的一个第三方库&#xff0c;它实现了MySQL客户端/服务器协议&#xff0c;使得Python程序能够与MySQL服务器进行交互。由于Python 2的mysql-python&#xff08;又称mysqldb&#xff09;模块在Python 3上支持不够完善&#xff0…

在C#中,typeof关键字

在C#中&#xff0c;typeof关键字被用于获取一个类型的 System.Type 对象。这个功能是非常有用的&#xff0c;尤其是在下面这些场景中&#xff1a; 反射&#xff08;Reflection&#xff09;: typeof在使用反射时非常关键。通过获取类型的 Type 对象&#xff0c;你可以查询这个类…

nextTick的原理

开发中有这么一个需求&#xff0c;回显的适合&#xff0c;el-tree的检查严格标志属性更新为true。当更新完成后&#xff0c;又要改为false。还原。 <template><div><el-tree:data"data"show-checkbox:check-strictly"checkStrictly"default…

linux安装java8

1、下载java 根据自己系统的位数下载 查看系统位数命令&#xff1a;getconf LONG_BIT 下载地址 https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 2、解压、移动 将下载的文件上传到linux系统中并解压 tar -zxvf jdk-8u333-linux…

LC 1154. 一年中的第几天

1154. 一年中的第几天 难度 &#xff1a; 简单 题目大意&#xff1a; 给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1&#xff1a; 输入&#xff1a;date "2019-01-09" 输出&#xff…

条件编译处理多端差异

条件编译https://uniapp.dcloud.net.cn/tutorial/platform.html#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91%E5%A4%84%E7%90%86%E8%B7%A8%E7%AB%AF%E5%85%BC%E5%AE%B9 <template><view class"container"><…