2. C++入门:缺省参数及函数重载

缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

void Func(int a = 0)
{
	cout << a << endl;
}

int main()
{
	Func();
	Func(10);

	return 0;
}

在形参的后面赋值,这个值就叫做缺省参数
可以不传参调用函数,不传参的时候,a的值就是缺省参数0
显示传的时候,a就用传的参数,不用缺省参数
注意
缺省值必须是常量或全局变量
C语言不支持(编译器不支持)

全缺省
#include <iostream>
using namespace std;

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

int main()
{
	Func();
	Func(1);
	Func(1, 2);
	Func(1, 2, 3);


	return 0;
}

三个缺省参数,变化出四种调用方式
![[Pasted image 20240513210346.png]]

注意

  • 不可以跳跃着传
Func(,2,);

只给第二个传,是错误的

  • 如果不传参数,就用缺省值
半缺省
#include <iostream>
using namespace std;

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

int main()
{
	//Func();  不支持了
	Func(1);
	Func(1, 2);
	Func(1, 2, 3);


	return 0;
}

注意

  • 缺省值只能从右往左给,必须是连续给,这样传参也是连续的。
  • 从左往右缺省,传参的时候会有歧义,从右往左缺省不会产生歧义
  • 不能间隔着给缺省值
不能声明和定义同时存在
  1. 函数的声明和定义同时有缺省参数,会报错
    因为怕声明和定义分别给不同的缺省参数,这样不知道以谁为准
  2. 也不能只在定义中给,声明中不给
    用这个函数的时候,有可能只包含了声明头文件
    这样在另外一个文件用的时候,include ”xxx.h“
    如果声明文件里没有缺省参数,就不知道这个函数没传参的时候给多少
  3. 所以最好的方式就是在函数声明的时候给缺省参数
#pragma once
include <stdio.h>

namaspace cho
{
	typedef struct Stack
	{
		int* a;
		int top;
		int capacity;
	}ST;
	
	void StackInit (ST* ps, int n = 4);
	void StackPush (ST* ps, int x);
}
#include "Stack.h"

namespace cho
{
	void StackInit (ST* ps, int n = 40)
	{
		ps->a = NULL;
		ps->top = 0;
		ps->capacity = 0;
	}
	
	void StackPush(ST* ps, int x)
	{
		//...
	}
}
#include <Stack.h>

int main()
{
	cho::ST s;
	cho::StackInit(&s);
	cho::StackPush(&s, 1);

	return 0;
}

函数重载

有点像一词多义
一个函数名有多个意义

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

C语言不支持同名函数
但是我们需要同名函数

参数类型不同
#include <stdio.h>
using namespace std;

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;
}

int main()
{
	Add(1, 2);
	Add(1.1, 2.2);
	
	return 0;
}

两个数相加,C语言的话这段代码就报错了;C++支持
![[Pasted image 20240513213948.png]]

会调用不同的函数

Add(1, 2.2);

传一个int,一个double会报错
不是因为匹配,int和double是有隐式类型转换的,传参的时候,可以考虑让int转double,也可以让double转int,会出现歧义,这里编译器会报错

参数个数不同
#include <stdio.h>
using namespace std;

void f()  
{  
cout << "f()" << endl;  
}  

void f(int a)
{  
cout << "f(int a)" << endl;  
}

int main()
{
	f();
	f(1);
	
	return 0;
}

注意

  • 函数名相同,参数不同(类型不同,个数不同),返回值可同可不同
  • 编译器会根据参数的不同去匹配不同的函数

[!NOTE] 返回值不同为什么不可以
两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分
如果返回值不同可以构成重载,调用的时候不知道要调谁
不能明确要调谁,会存在调用歧义

函数顺序不同

也可以归类为类型不同

#include <iostream>
using namespace std;

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()
{
	f(10, 'a');
	f('a', 10);
	return 0;
}
重载和缺省同时存在

如果是

#include <iostream>
using namespace std;

void f()  
{  
cout << "f()" << endl;  
}  

void f(int a = 0)
{  
cout << "f(int a)" << endl;  
}

int main()
{
	f();
	f(1);
	
	return 0;
}

构成重载
f()没有参数,f(int a = 0)有一个int参数
只看参数类型,不看有没有缺省参数

但是实践的时候会有问题
f()不知道会调谁
不传参数的时候会有二义性

为什么C++支持函数重载

从编译链接的角度来看

#pragma once
#include <iostream>
using namespace std;

void f(int a, char b);
void f(char b, int a);
#include "Func.h"

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;
}
#include "Func.h"

int main()
{
	f(10, 'a');
	f('a', 10);
	
	return 0;
}
前置知识

程序编译过程:
![[Pasted image 20240514121333.png]]

编译器对多文件进行编译的时候
会进行

1. 预处理

头文件展开/宏替换/条件编译/去掉注释…

其中头文件展开,会将Fun.h拷贝过去
不过只是直接拷贝到文件里
编译器会生成Func.i和Test.i文件

Func.i文件里有Func函数的声明和定义
Test.i文件里有Func函数的声明和实际调用

2. 编译

检查语法,生成汇编代码
生成Func.s和Test.s文件
Func.s里面是两个Func函数相关的汇编代码
![[Pasted image 20240513224455.png]]

Test.s里面有main函数调用相关的汇编代码
![[Pasted image 20240513224113.png]]

编译的时候,Test.s还没有call函数的地址
但是编译器可以让过
编译的时候,函数可能只有声明,如果有函数的声明可以和main函数里的调用对的上的话,暂时让过
函数的定义可能在其他文件里

3. 汇编

转换成CPU能认识的二进制机器码
生成Func.o和Test.o

4. 链接

合并到一起,链接一些没有确定的函数地址
生成a.out
如果没有函数定义
![[Pasted image 20240513231036.png]]

会报错,而且不是编译错误,而是LNK错误

函数名修饰规则

链接的时候,每个函数要找地址
如果只有声明,没有定义
没有地址,call的时候就只有一个问号
要找这个函数的地址

  1. 由于C语言没有同名函数,链接函数地址时,就用函数名去找。C语言里有个叫符号表的东西,只会记录函数名和地址的映射。所以不支持函数重载
    ![[Pasted image 20240514121926.png]]

  2. 而C++有函数重载,符号表里记录的是修饰下的函数名和地址的映射
    Linux函数名修饰规则
    _Z 函数名字符个数 函数名 参数首字母
    Func(int a, char b)就是_Z4fic
    Func(char b, int a)就是_Z4fci
    ![[Pasted image 20240514121944.png]]

找地址的时候,把参数带入进去修饰函数名,就根据修饰下的字符串去找
参数不同,修饰出来的名字就不同,就可以进行对应地找地址了

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

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

相关文章

【simulink】Scrambling 加扰

https://ww2.mathworks.cn/help/comm/ug/additive-scrambling-of-input-data-in-simulink.html 草图 simulink 代码图

GPT-4o正式发布;零一万物发布千亿参数模型;英国推出AI评估平台

OpenAI 正式发布 GPT-4o 今天凌晨&#xff0c;OpenAI 正式发布 GPT-4o&#xff0c;其中的「o」代表「omni」&#xff08;即全面、全能的意思&#xff09;&#xff0c;这个模型同时具备文本、图片、视频和语音方面的能力&#xff0c;甚至就是 GPT-5 的一个未完成版。 并且&…

mysql 一次删除多个备份表

show tables时&#xff0c;发现备份的表有点多&#xff0c;想要一个sql就删除 总不能drop table xx ; 写多次吧。 方式一 1.生成删除某个数据库下所有的表SQL -- 查询构建批量删除表语句&#xff08;根据数据库名称&#xff09; select concat(drop table , TABLE_NAME, ;)…

Axure10_win安装教程(安装、汉化、授权码,去弹窗)

1.下载Axure10 链接&#xff1a;https://pan.baidu.com/s/1fc8Bgyic8Ct__1IOv-afUg 提取码&#xff1a;9qew 2.安装Axure10 因为我的电脑是Windows操作系统&#xff0c;所以我下载的AxureRP-Setup-Beta v10.0.0.3816 (Win).exe 一直点下一步就行 3.Axure10中文 打开Axure…

fdatool中的幅值响应 怎么计算

设计一个幅值是100&#xff0c;45hz的正弦波&#xff0c;设计一个滤波器&#xff0c;观察滤波器的幅值响应&#xff1a; 滤波前的数据的峰峰值是100*2&#xff1b; 假设滤波后的数据峰峰值变成95*2&#xff1b;&#xff08;95*2是滤波后的数据的峰峰值&#xff0c;不是fft后的值…

豆浆机缺水检测功能如何实现的

豆浆机缺水检测功能的实现是通过光学液位传感器来完成的。这种传感器具有多种优势&#xff0c;如内部所有元器件经过树脂胶封处理&#xff0c;没有任何机械活动部件&#xff0c;免调试、免检验、免维护等特点。它采用了光电液位传感器内置的光学电子元件&#xff0c;体积小、功…

自动化神器Autolt,让你不再重复工作!

随着互联网不断发展&#xff0c;它给我们带来便利的同时&#xff0c;也带来了枯燥、重复、机械的重复工作。今天&#xff0c;我要和大家分享一款老牌实用的自动化工具&#xff1a;AutoIt&#xff0c;它能够让你告别繁琐的重复性工作&#xff0c;提高工作效率。 这里透露一下&am…

python 虚拟环境多种创建方式

【一】说明介绍 &#xff08;1&#xff09;什么是虚拟环境 在Python中&#xff0c;虚拟环境&#xff08;Virtual Environment&#xff09;是一个独立的、隔离的Python运行环境&#xff0c;它拥有自己的Python解释器、第三方库和应用程序。通过创建虚拟环境&#xff0c;可以确…

解析流中 apts 与 vpts的分布

流中 apts 与 vpts的分布情况&#xff0c;同时使用图显示出来 一&#xff0c;最好的方式是使用EasyICE 来查看&#xff0c;这个自动化工具是很好用的&#xff1a; 二&#xff0c; 当EasyICE不能打出理想的数据的时候&#xff0c;可以自己来提取数据&#xff0c;画出对应的图&a…

老铁,对不住了,没有B端成品界面可售,都是定制化设计

经常有粉丝老铁问我有没有成品的UI图可以出售&#xff0c;实在对不住&#xff0c;我们不销售设计成品。 UI设计图是一种设计稿&#xff0c;它是用来展示和呈现产品的界面设计和交互效果的&#xff0c;而不是一个完整的、可交付的成品。UI设计图通常是以静态的形式呈现&#xf…

HTML常见标签-标题标签

标题标签 标题标签一般用于在页面上定义一些标题性的内容,如新闻标题,文章标题等,有h1到h6六级标题 代码 <body><h1>一级标题</h1><h2>二级标题</h2><h3>三级标题</h3><h4>四级标题</h4><h5>五级标题</h5>…

没有申请域名的情况下,用navicat远程连接我们的服务器的Mysql数据库

我们可以根据公网ip用shell来远程连接 首先我们打开自己买的服务器 例如你看这个&#xff0c;就是我们的公网IP 如果服务器里面没有安装mysql数据库的话&#xff0c;那么我们可以用一个轻量级的docker来安装数据库代替一下 我们用docker弄个轻量级的mysql5.7.36&#xff0c;…

【SRC实战】小游戏漏洞修改分数打榜

挖个洞先 https://mp.weixin.qq.com/s/Um0HU2srvZ0UlZRAsbSVug “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 “ 如何刷分提高排名&#xff1f;” 1、进入小游戏&#xff0c;类似于跳一跳 2、开始时每次加1分 3、随着游戏进行…

react18【系列实用教程】react-router-dom —— 路由管理 (2024最新版)

类似 vue-router 安装 npm i react-router-domreact-router 中包含 native 的开发&#xff0c;仅网站开发&#xff0c;使用更轻量的 react-router-dom 即可 路由模式 history 模式需要后端支持&#xff0c;使用 createBrowserRouter 函数实现hash 模式无需后端支持&#xff0c;…

一键批量合并视频:掌握视频剪辑技巧解析,轻松创作完美影片

在数字时代的浪潮下&#xff0c;视频已成为人们记录和分享生活的重要工具。然而&#xff0c;对于许多非专业视频编辑者来说&#xff0c;将多个视频片段合并成一个完整的影片却是一项复杂且耗时的任务。幸运的是&#xff0c;云炫AI智剪一键批量合并视频功能的出现&#xff0c;让…

C/C++:Windows动态链接库

动态链接库&#xff08;Dynamic Link Library&#xff0c;简称DLL&#xff09;是在运行时加载的库&#xff0c;它们的代码和数据在内存中与目标程序共享&#xff1b;这意味着多个程序可以共享相同的库实例&#xff0c;并且库的代码可以在不重新编译目标程序的情况下更新。 工作…

【C#】WPF加载浏览器

结果展示 下载SDK 前端代码 红色框住的为添加代码 <Window x:Class"WPFwebview.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://…

jenkins自动化持续集成

一、安装Jenkins 1、下载安装jdk-17、jenkins.msi&#xff08;注意如果jenkins安装到最后一步时&#xff0c;无法完成&#xff0c;可能是jdk版本和Jenkins版本不匹配造成&#xff09; 2、Jenkins安装 &#xff08;1&#xff09;双击jenkins.msi&#xff0c;点击next &#x…

网安面经之文件上传漏洞

一、文件上传漏洞 1、文件上传漏洞的原理&#xff1f;危害&#xff1f;修复&#xff1f; 原理&#xff1a;⽂件上传漏洞是发⽣在有上传功能的应⽤中&#xff0c;如果应⽤程序对⽤户上传的⽂件没有控制或者存在缺陷&#xff0c;攻击者可以利⽤应⽤上传功能存在的缺陷&#xff…

数据结构(十四)----排序算法(1)

目录 一.排序的基本概念 二.插入排序 1.直接插入排序 2.折半插入排序 三.希尔排序&#xff08;Shell Sort&#xff09; 四.交换排序 1.冒泡排序 2.快速排序 快速排序算法的效率&#xff1a; 快速排序算法的稳定性&#xff1a; 这一篇博客的重点主要是快速排序&#x…