C++:缺省参数函数重载

news2024/11/15 19:42:28

目录

 C++/C语言 函数调用的工作原理:

函数调用一般分为两个部分:

缺省参数: 

缺省参数的分类: 

全缺省参数 

半缺省参数 

注意事项:

缺省参数与C语言的调用参数对比:

函数重载:

函数重载的工作原理:

函数重载的分类: 


 C++/C语言 函数调用的工作原理:

在讲诉缺省参数和函数重载之前我们首先要了解一下C语言/C++的 函数调用的工作原理。

函数调用一般分为两个部分:

  • 函数声明
  • 函数定义

函数声明主要是写在头文件中,而函数定义则写在.c或.cpp的源文件中,并且函数定义使用包含头文件的方式,对头文件进行连接。

而后通过Linux的翻译工作原理我们可以知道,编译器在执行代码之前会执行四个步骤,分别是:预处理、编译、汇编、链接

其中,在预处理阶段,函数定义中包含的头文件,会将头文件的内容完全展开并复制在定义代码的上方。

其次,在链接阶段,函数定义中的代码会变成一串机器代码以便编译器进行执行,而这一串机器代码在形成的过程中会将这一大串代码的首个元素的地址,发送到一共特点的函数中,最后这个函数同样会形成一个地址,发送到函数声明中,由函数声明调用。

  •  也就是说,函数调用的工作原理其实是:

函数声明------(中间函数地址)---->中间函数------(函数定义的首元素地址)------>函数定义代码

且需要注意一点的是,没有函数定义也就不会产生函数定义的代码,即使有函数声明也无法使用函数的调用

缺省参数: 

缺省参数通俗来讲就是默认参数,在函数调用的时候给予调用的参数一个默认值,当没有给予这个参数数值时,就调用这个默认值进行函数的运算或者执行函数。

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

缺省参数的分类: 

  • 全缺省参数 

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 Func(int a = 10, int b, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

同时还需要注意在使用新参数覆盖缺省参数时,也必须连续覆盖,而不能跳过覆盖!

void Func(int a = 5, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }
int main()
{
 Func();      //正确的
 Func(10);    //正确的
 Func(1,2);   //正确的
 Func(1,2,3); //正确的
 Func(1,,2);  //不正确的
 Func(,2,3);  //不正确的
return 0;
}

最后 需要注意,缺省参数最好在声明中出现,如果想要定义中也出现,最好函数定义部分的缺省参数必须和声明中的缺省参数保持一致!

//a.h
  void Func(int a = 10);
  
  // a.cpp
  void Func(int a = 20)
 {}
  
  // 注意:如果声明与定义位置同时出现
  //恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。

缺省参数与C语言的调用参数对比:

如下代码所示,当函数调用时没有使用缺省参数,则使用Func()和Func(10)会发生报错问题,而使用了缺省参数后 ,空出的部分或者说没有使用数值的部分默认使用了缺省参数,这就是缺省参数和普通调用参数的不同之处!

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

 Func();      
 Func(10);    

return 0;
}

函数重载:

函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。 

简单来说,函数重载允许使用相同的函数名,但不同的是,内部的参数必须不一样! 

函数重载的工作原理:

上文讲诉过,函数在调用时,在链接的阶段会访问到中间函数,而中间函数的内部可能会有多个函数的地址,而链接编译器则会通过函数的名字来寻找他所对应的函数,从而找到函数定义的地址,

而C语言中函数不能同名的原因也是如此,连接编译器会分不清楚到底那个是它需要的地址。

但是c++就不会,因为在c++的默认规则中,每输入一共函数,这个函数就会被编译器默认的在内部修改名字,所以就不会有着函数名字重复的冲突了! 

函数重载的分类: 

#include<iostream>
using namespace std;

// 1、参数类型不同
int Add(int left, int right)
{
 cout << "int Add(int left, int right)" << endl;
 return left + right;
}
double Add(double left, double right)
{
 cout << "double Add(double left, double right)" << endl;
 return left + right;
}

// 2、参数个数不同
void f()
{
 cout << "f()" << endl;
}
void f(int a)
{
 cout << "f(int a)" << endl;
}

// 3、参数类型顺序不同
void f(int a, char b)
{
 cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
 cout << "f(char b, int a)" << endl;
}

int main()
{
 Add(10, 20);
 Add(10.1, 20.2);

 f();
 f(10);

 f(10, 'a');
 f('a', 10);

 return 0;

}

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

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

相关文章

C++ qt标题栏组件绘制

本博文源于笔者在学习C qt制作的标题栏组件&#xff0c;主要包含了&#xff0c;最小化&#xff0c;最大化&#xff0c;关闭。读者在看到这篇博文的时候&#xff0c;可以直接查看如何使用的&#xff0c;会使用了&#xff0c;然后进行复制粘贴源码部分即可。 问题来源 想要制作…

【禅道】下载安装及基本流程----【图文并茂】从头到尾讲解

目录 一 禅道简介 二 下载安装 三 基本流程 3.1添加用户(管理员) 3.2 添加产品 (产品经理) 3.2.1 创建模块 3.2.2 创建计划 3.2.3 创建需求 3.3 添加项目(项目经理) 3.3.1 设置团队 3.3.2 关联产品需求 3.2.3 分配任务 3.3.4 创建版本(研发人员) 3.3.5 提交测试 …

SecureCRT的安装

SecureCRT的安装 加强版的串口调试助手 全部默认安装&#xff0c;默认安装在c盘 SecureCRT收费&#xff0c;可以下载Putty安装 后续完善

关于Spring和缓存雪崩、穿透、击穿、预热的最常见的十道面试题

面试题一&#xff1a;什么是缓存雪崩&#xff1f;如何解决缓存雪崩&#xff1f; 缓存雪崩指的是在短时间内&#xff0c;有大量的请求直接查询术后句酷&#xff0c;从而对数据库造成大量的压力&#xff0c;严重情况下可能导致数据库宕机的情况叫做缓存雪崩 我们可以看一下正常…

k8s架构、工作流程、集群组件详解

目录 k8s概述 特性 作用&#xff08;为什么使用&#xff09; k8s架构 k8s工作流程 k8s集群架构与组件 核心组件详解 Master节点 Kube-apiserver Kube-controller-manager Kube-scheduler 存储中心 etcd Node Kubelet Kube-Proxy 网络通信模型 容器引擎 k8s核…

【C语言入门】分支和循环

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C语言 个人主页&#xff1a;Celias blog~ 目录 引言 1. if语句 1.1 if 1.2 else 1.3 if的嵌套 2. 操…

python 正则表达式学习(1)

正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 1. 特殊符号 1.1 符号含义 模式描述^匹配字符串的开头$匹配字符串的末尾.匹配任意字符&#xff0c;除了换行符&#xff0c;当re.DOTALL标记被指定时&#xff0c;则可以匹配包…

计算机设计大赛 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

工厂HVAC暖通系统如何实现优化?

在工厂运营中&#xff0c;HVAC暖通系统是维持良好生产环境的关键组成部分。然而&#xff0c;由于能效低下&#xff0c;这些系统可能导致昂贵的能源开支&#xff0c;同时对环境造成负担。本文将深入研究工厂HVAC系统的能效低下原因&#xff0c;介绍HVAC系统优化的关键步骤&#…

老照片模糊不清怎么修复?教你几个修复模糊照片的方法

老照片&#xff0c;如同历史的见证者&#xff0c;承载着家族的记忆与故事。它们无声地诉说着我们的成长轨迹&#xff0c;将那些温馨而美好的瞬间永恒定格。然而&#xff0c;岁月无情&#xff0c;这些老照片逐渐变得模糊不清&#xff0c;甚至布满了岁月的痕迹&#xff0c;令我们…

【第六课课后作业】大模型评测

大模型评测 大模型评测安装环境安装数据准备查看支持的数据集和模型 启动测评评测结果 大模型评测 安装 环境安装 conda create --name opencompass --clone/root/share/conda_envs/internlm-base source activate opencompass git clone https://github.com/open-compass/ope…

防火墙安全策略以及NAT简易拓扑

实验需求 拓扑如下 前期的配置如二层交换机和防火墙的配置就不再赘述 感兴趣的童鞋可以看上一篇博客 防火墙路由模式简易拓扑-CSDN博客 这里主要讲一讲安全策略&#xff0c;用户认证以及NAT策略的配置 配置实现 安全策略 1.生产区在工作时间内可以访问DMZ区&#xff0c;仅…

Python requests网络库源码分析(第三篇:通过学习异常模块,了解http协议)

前言 作者在requests包下&#xff0c;定义了exceptions模块&#xff0c;该模块中定义执行http请求过程中常见的错误&#xff0c;熟悉这些错误有助于我们写出健壮的业务程序&#xff0c;同时还能温习http的知识点&#xff0c;本文基于的requests版本为2.27.1 exceptions模块&…

qt学习:tcp区分保存多个客户端

在前面文掌的tcp客服端服务端进行更改 qt学习&#xff1a;Network网络类tcp客户端tcp服务端-CSDN博客https://blog.csdn.net/weixin_59669309/article/details/135842933?spm1001.2014.3001.5501前面的服务端每次有新的客户端连接&#xff0c;就会覆盖掉原来的指针&#xff0…

Termux结合内网穿透实现无公网ip远程SFTP传输文件

目录 前言 1. 安装openSSH 2. 安装cpolar 3. 远程SFTP连接配置 4. 远程SFTP访问 4. 配置固定远程连接地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Termux结合内网穿透实现无公网ip远程SFTP传输文件&#xff0c;希望大家能…

CentOS7自动备份数据库到git

虽然数据库没什么数据&#xff0c;但是有就是珍贵的啦&#xff0c;为了服务器什么的无了&#xff0c;所以还是要自动备份一下比较好。 Open备忘第一页 步骤 在Gitee&#xff08;github&#xff09;上创建一个私有仓库Gitee&#xff08;github&#xff09;配置好服务器的ssh在服…

DAY10_SpringBoot—SpringMVC重定向和转发RestFul风格JSON格式SSM框架整合

目录 1 SpringMVC1.1 重定向和转发1.1.1 转发1.1.2 重定向1.1.3 转发练习1.1.4 重定向练习1.1.5 重定向/转发特点1.1.6 重定向/转发意义 1.2 RestFul风格1.2.1 RestFul入门案例1.2.2 简化业务调用 1.3 JSON1.3.1 JSON介绍1.3.2 JSON格式1.3.2.1 Object格式1.3.2.2 Array格式1.3…

mysql 多版本并发控制mvcc

行级锁的一个变种避免了加锁&#xff0c;开销低非阻塞读操作&#xff0c;写操作是行级原理&#xff1a;使用数据在某个时间点的快照实现&#xff0c;不同事务在同一个时间可以看到同一个表中的不同数据。分类&#xff1a;乐观&#xff0c;悲观在一行中存储更多数据&#xff0c;…

芯片查询工具:道合顺电子网助您轻松实现芯片查询、分析与调试

在电子领域&#xff0c;对芯片进行准确的查询、分析和调试是确保设备正常运行和故障排查的关键步骤。为了帮助用户轻松实现这一过程&#xff0c;道合顺电子网提供了一系列高效的芯片查询工具&#xff0c;助您快速获取所需信息、分析数据以及进行灵活的调试操作。 为什么选择道…

SpringMVC-HttpMessageConverter 报文信息转化器

文章目录 HttpMessageConverter一、概念二、RequestBody三、RequestEntity四、 ResponseBody1.返回JSON格式的字符串 五、RestController六、ResponseEntity HttpMessageConverter 一、概念 报文信息转化器&#xff0c;将请求报文转化为Java对象&#xff0c;或将Java对象转化…