【C++缺省参数、函数重载详解】

news2024/11/15 21:22:24

目录

  • 一、缺省参数
    • 1.1缺省参数的定义
    • 1.2缺省参数的分类
    • 1.3缺省参数使用时的注意事项
  • 二、函数重载
    • 2.1函数重载的概念
    • 2.2为什么要有函数重载
    • 2.3 C++支持函数重载的原理

一、缺省参数

1.1缺省参数的定义

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。比如:
在这里插入图片描述
在这里插入图片描述
缺省参数给人的感觉就好像时备胎一样。如果正主传过来了,那么他就没什么意义;如果正主没有过来,那么他就有存在的意义了。
C++里面花费了很大的力气引入缺省参数,肯定是有很大的意义的。
其意义在于提高程序的可扩充性。比如某个以及写好的函数需要添加新的参数,而原先调用函数的的那些语句未必需要新增加的参数,为了避免对原来所有调用该函数的地方进行修改,就可以使用函数缺省参数了。比如:
在这里插入图片描述

1.2缺省参数的分类

  • 全缺省参数
    在这里插入图片描述
  • 半缺省参数
    在这里插入图片描述

1.3缺省参数使用时的注意事项

  • 半省参数必须从左往右依次来给出,不可以间隔着给。比如:
    在这里插入图片描述
  • 缺省参数不能在函数声明和定义中同时出现。比如:
    Add.h文件
    在这里插入图片描述
    Add.cpp文件
    在这里插入图片描述
    test测试文件
    在这里插入图片描述
    而改过来后就可以编译通过。比如:
    Add.h文件
    在这里插入图片描述
    Add.cpp文件
    在这里插入图片描述
    test测试文件
    在这里插入图片描述
  • . 缺省值必须是常量或者全局变量

二、函数重载

2.1函数重载的概念

**函数重载:**是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数类型类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。函数重载C本身不具有这个概念。为什么不具有下面我会尽量解释清楚。
比如:

#include<iostream>
using namespace std;
// 1、参数类型不同
void func1(int left, int right)
{
	cout << "int func1(int left, int right)" << endl;
}
void func1(double left, double right)
{
	cout << "double func1(double left, double right)" << endl;
}
// 2、参数个数不同
void func2()
{
	cout << "func2()" << endl;
}
void func2(int a)
{
	cout << "func2(int a)" << endl;
}
// 3、参数类型顺序不同
void func3(int a, char b)
{
	cout << "func3(int a,char b)" << endl;
}
void func3(char b, int a)
{
	cout << "func3(char b, int a)" << endl;
}
int main()
{
	func1(10, 10);
	func1(10.0, 10.0);

	func2();
	func2(10);

	func3(10, 'A');
	func3('A', 10);
	return 0;
}

2.2为什么要有函数重载

我们都知道C++是由C延申过来的,所有C语言不具有的函数重载对于语言来说肯定是意义非凡。那么它具体有哪些作用呢?

  • 函数书写方便。比如要写加法函数。第一写整形加法函数,第二个写浮点型加法函数,那么这些函数的函数名都可以是Add,只需要改参数类型即可,不需要用别的函数名加以区分。
  • 类的构造函数也是重载函数。构造函数是同名的成员函数,它一般被划分为:有参构造、无参构造、拷贝构造,它们构成函数重载。
  • 模板也是利用的函数重载

2.3 C++支持函数重载的原理

C++支持函数重载的原理涉及的知识点挺多的,在这个就不完全展开细说。等哪天我完全懂的这方面的知识,我再来这里把这个坑给填上。
我们都知道生成一个可执行程序需要:预处理编译汇编链接这几个阶段。
预处理的作用:头文件展开、去注释、条件编译、宏替换(在linux平台下,去注释先于宏替换)
编译的作用:先进行语法检查,然后将高级语言写的代码转化为汇编指令
汇编的作用:指将汇编指令转为二进制代码
链接的作用:并不是简单的将多文件合并,主要进行的是文件之间的交互
在这里插入图片描述
这里拿func.c、func.h、test.c来举例。
func.h主要在func.c和test.c中展开。
func.c在编译之后,链接之前,会生成一个符号表,符号表的主要作用是映射函数名和函数地址,简单来说就是存储函数名和对应的函数地址,然后Test.c就以调用的函数名去取符号表中的函数名对应的地址,完成func.c和test.c的交互。
在这里插入图片描述
有了这个知识点就可以粗略的解释为什么C++支持函数重载,C不支持函数重载。
其原因是:因为C语言的函数名修饰规则与函数参数无关,或者说没有修饰规则。
而C++在编译期间,会将函数名修饰一下,即将函数名与参数联系在一起。

在这里插入图片描述
在这里插入图片描述
(以上的函数名变化参考至linux平台,具体函数名修饰规则不同平台不一样)
上图同样可以解释为什么返回值不构成函数重载,因为c++的函数名修饰规则不考虑返回值,只将函数名与参数结合起来组成新的函数名。

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

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

相关文章

搭建B2B2C多用户国际版商城系统,快速为外贸企业开拓新市场

企业市场竞争激烈&#xff0c;不只体现在国内&#xff0c;甚至全球&#xff0c;电商行业发展迅速&#xff0c;各企业各行业甚至进出口都竞争相当激烈。要想在这种告诉竞争中脱颖而出&#xff0c;开拓新市场&#xff0c;带来新盈利与新契机是必不可少的。易族智汇Javashop助力企…

nmap学习笔记

一、环境准备 Windows10主机Kali虚拟机&#xff08;使用nmap的地方&#xff09;metasploitable虚拟机为以上三个操作系统配置静态IP。 Windows主机的IP&#xff1a;192.168.80.3Kali的IP&#xff1a;192.168.80.2metasploitable的IP&#xff1a;192.168.80.4 具体配置方法请参…

STM32-窗口看门狗WWDG实验

窗口看门狗本质上是一个能产生系统复位信号和提前唤醒中断的定时器。它通常被用来监测&#xff0c;由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新&#xff0c;否则看门狗电路在达到预置的时间周期时…

代码随想录二刷-队列及其应用题目(JS)【重要】

239.滑动窗口最大值 题目 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶&#xff1a; 你能在线性时间复杂度内解决此题吗…

Thinkpad-t470电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Thinkpad-t470 处理器Intel Core i7-6600U 2.6GHz / 3.4Ghz Turbo已驱动 内存16GB DDR4 2666Mhz (SK Hynix)已驱动 硬盘Intel SSD Pro 7600P 51…

与Linux的文件权限有关的知识

在Linux系统中&#xff0c;每个文件都有一个所有者和一个用户组。此外&#xff0c;系统还定义了一个“其他人”分类。 文件的所有者通常是创建该文件的用户&#xff0c;而用户组则是在创建该文件时指定的。如果没有指定&#xff0c;则默认为创建用户的主用户组。用户组可以在文…

核心业务1:账户绑定业务

核心业务1:账户绑定业务 1.业务流程图 2.账户绑定数据库设计 3.账户绑定业务流程 4.代码逻辑 5.代码逻辑细节 核心业务1:账户绑定业务 1.业务流程图 ①用户绑定数据到商户平台(已

C++map/set与unordered系列的区别

文章目录 map/set与unordered系列的区别map/set与unordered系列的性能对比测试总结 map/set与unordered系列的区别 1: map/set遍历时是有序的,unordered_map/unordered_set遍历时是无序的. 以set和unordered_set容器为例: 2: map/set是双向迭代器,底层数据结构为红黑树,unor…

重磅 | Shifu物联网开发框架成为CNCF认证项目

近日&#xff0c;边无际Shifu项目被收录进CNCF云原生全景图&#xff0c;成为了云原生计算基金会认证的项目之一。此次收录证明了Shifu具备了符合CNCF标准的技术能力和良好的社区发展&#xff0c;展现了Shifu在云原生计算领域的实力和可信度&#xff0c;巩固了Shifu在云原生领域…

J2EE,Java EE,Jakarta EE 命名之间的恩恩怨怨

介绍 简单来说&#xff0c;上面所有的名字指的都是一个东西 Java Platform, Enterprise Edition 上面的几个名词都是下面的内容的简写&#xff1a; J2EE(Java 2 Platform, Enterprise Edition)Java EE (Java Platform, Enterprise Edition)Jakarta EE(Jakarta Enterprise Edi…

learn_C_deep_1 (C程序补充知识、变量的声明和定义、声明和定义的区别)

目录 C程序补充知识 变量的声明和定义 1.什么是变量&#xff1f; 2.变量的本质是什么&#xff1f; - 所有的变量都要在内存的某个位置开辟空间 3.变量的定义和声明形式、初始化和赋值的区别 4.为什么要定义变量 声明和定义的区别 C程序补充知识 先让我们来看一段C语言…

史上最严宝宝口粮新国标出台,DHA和维生素D可能无需额外补充了

自2023年2月22日起&#xff0c;我国婴幼儿配方食品&#xff08;以下简称配方奶&#xff09;新国标开始实施。这意味着2023年2月22日以后在中国上架销售的配方奶必须符合新国标&#xff0c;重新取得国家市场监督管理总局食品评审中心&#xff08;CFE-SAMR&#xff09;的注册。这…

【单片机】基于Arduino cli和VS Code配置开发环境,彻底抛弃Arduino IDE

文章目录 0 前言1 VS Code的优势和Arduino IDE的劣势2 前期准备3 Arduino cli3.1 Arduino cli是什么3.2 下载与安装3.3 基本使用3.4 开发环境配置 4 VS Code配置5 参考链接 0 前言 之前有在电脑上基于VS Code配置Arduino环境&#xff0c;大致方法就是在安装Arduino IDE的前提下…

SCT2650STER,可以实现低成本升降压

市面上主流的中高压升降压拓扑方案有四开关管升降压控制芯片、SEPIC/反激控制芯片等。实际上四开关管升降压芯片成本很高&#xff0c;而SEPIC/反激控制芯片设计复杂。 如果仅需要升降压功能&#xff0c;功率较小&#xff0c;不需要隔离时&#xff0c;本篇解决方案将以SCT2650为…

真题详解(地址索引)-软件设计(五十一)

真题详解&#xff08;单元测试&#xff09;-软件设计&#xff08;五十)https://blog.csdn.net/ke1ying/article/details/130189173?spm1001.2014.3001.5501 指令寻址方式 有四种&#xff0c;直接寻址&#xff0c;寄存器寻址&#xff0c;隐含寻址&#xff0c;立即寻址。 按寻…

基于高斯两步移动搜寻法(2SFCA)的城市绿地可达性分析

【2SFCA的基本思路,可以略过】 对每个供给点j,搜索所有在j搜寻半径(d0)范围内的需求点(k),计算供需比Rj;对每个需求点i,搜索所有在i搜寻半径(d0)范围内的供给点(j),将所有的供需比Rj加总得到i点的可达性Ai。 【数据】 成都市城区绿地数据、各街道小区数据、路网…

基于Rush.js的Monorepo实战

基于Rush.js的Monorepo入门实战 概述 Monorepo是一种软件开发模式&#xff0c;它将多个项目或组件存储在同一个代码库中&#xff0c;而不是将它们分散到多个库中。这样做可以方便跨项目的代码重用、版本控制、依赖管理等&#xff0c;被广泛应用于大型软件公司的开发流程中。 …

动力节点Vue3笔记——Vue程序初体验

目录 一、Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 一、Vue程序初体验 可以先不去了解Vue框架的发展历史、Vue框架有什么特点、Vue是谁开发的&#xff0c;对我们编写Vue程序起不到太大的作用&#xff0c;…

C语言从入门到精通第4天(1~3天的扩展)

1~3天的扩展 拓展数据类型sizeof关键字整型数据的打印格式字符类型的输出格式ASCII码表转义字符进制 拓展数据类型 在开发过程中我们需要处理各种类型的数据&#xff0c;C语言处理基本类型还有其他的类型&#xff1a; sizeof关键字 C语言中可以通过sizeof关键字获取某个数据…

Java源码(三)SpringBoot Web容器应用上下文

思维导图 本文主要分析ServletWebServerApplicationContext源码 SpringBoot Web容器应用上下文&#xff08;这是个人的翻译, 如有不足之处还望指出, 大佬勿喷!!!&#xff09; 1.自我思考及复盘 备注&#xff1a; 自我思考及复盘是为了养成带着问题阅读源码及阅读完源码后总结…