【C++】入门 --- 缺省参数函数重载

文章目录

  • 🥮一、缺省参数
    • 🍕1、基本概念
    • 🍕2、缺省参数的分类
      • 🚩全缺省参数
      • 🚩半缺省参数
      • 🚩缺省参数实用案例
  • 🥮二、函数重载
    • 🍕1、函数重载概念
      • 1️⃣参数类型不同
      • 2️⃣参数个数不同
      • 3️⃣参数类型顺序不同
  • 🥮三、C++支持函数重载的底层原理--函数名修饰

在这里插入图片描述

🥮一、缺省参数

🍕1、基本概念

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

🌰举个栗子👇

//缺省参数
void Func(int a = 1)
{cout << a << endl;
}int main()
{Func(10);Func();return 0;
}

在这里插入图片描述

🚨注意:缺省值(函数形参的默认值)不能同时在函数声明和函数定义中给出(缺省参数不能在函数声明和定义中同时出现);

🚨注意:缺省值必须是常量或者全局变量。

🍕2、缺省参数的分类

🚩全缺省参数

🔴全缺省参数:每个形参都指定缺省值

🌰举个栗子👇

//全缺省参数
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;
}

在这里插入图片描述

🚩半缺省参数

🔴半缺省参数:为部分形参指定缺省值

🌰举个栗子👇

//半缺省参数
void Func(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}int main()
{Func(1);Func(1,2);Func(1, 2, 3);return 0;
}

在这里插入图片描述

🚨注意:半缺省参数必须从右往左依次来给出,不能间隔着给

下面这种情形是不允许的👇

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

在这里插入图片描述

🚩缺省参数实用案例

假如要实现一个栈的结构,我们不知道要入栈插入多少个数据,所以不知道初始化开辟多少内存空间合适,给多了浪费,给少了不够用,这时我们就可以使用缺省参数

🌰请看演示代码👇

Stack.h

#include<stdlib.h>
namespace N1
{typedef struct Stack{int* a;int top;  int capacity;}ST;//不允许声明和定义同时给缺省参数//声明给,定义不给void StackInit(ST* ps, int N = 4){ps->a = (int*)malloc(sizeof(int) * N);ps->top = 0;ps->capacity = 0;}

Test.cpp

#include "Stack.h"int main()
{N1::ST st1;StackInit(&st1, 10);//知道10个for (size_t i = 0; i < 10; i++){StackPush(&st1, i);}N1::ST st2;StackInit(&st2, 100);//知道100个for (size_t i = 0; i < 100; i++){StackPush(&st2, i);}//不知道可能会插入多少个N1::ST st3;StackInit(&st3);return 0;
}

🥮二、函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。

比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个
是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”

🍕1、函数重载概念

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

重载函数之间是通过函数的 形参个数 或 形参类型 或 形参类型顺序 来区分的(只有这三个区分标准),重载函数之间的区分在于形参的差异。

1️⃣参数类型不同

// 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️⃣参数个数不同

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

3️⃣参数类型顺序不同

// 3、参数类型顺序不同
void func2(int a, char b)
{cout << "func2(int a,char b)" << endl;
}
void func2(char b, int a)
{cout << "func2(char b, int a)" << endl;
}
int main()
{cout << Add(10, 20) << endl;cout << Add(10.1, 20.2) << endl;cout << endl;func1();func1(10);cout << endl;func2(10, 'a');func2('a', 10);return 0;
}

在这里插入图片描述

🚨注意以下两种情况不构成函数重载:

namespace M1
{void func(int x){};
}namespace M2
{void func(int x){};
}

不在同一作用域中(函数重载必须在同一作用域中)☝️

namespace M1
{void func(int x){};
}namespace M1
{void func(int x){};
}

自动合并了☝️

namespace M1
{void func(int x){};
}namespace M1
{void func(double x){};
}

构成函数重载✅

函数重载和缺省参数没有关系:

void func(int a)
{cout << "void func(int a)" << endl;
}void func(int a, int b = 1)
{cout << "void func(int a, int b)" << endl;
}int main()
{func(1, 2);//调用存在歧义,不知道调用哪个//func(1);return 0;
}

在这里插入图片描述

🥮三、C++支持函数重载的底层原理–函数名修饰

形成可执行文件要四个阶段:预处➡️编译➡️汇编➡️链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

void func(int i, double d)
{cout << "void func(int i, double d)" << endl;
}void func(double d, int i)
{cout << "void func(double d, int i)" << endl;
}int main()
{func(1, 1.1);  // call func()func(1.1, 1);  // call func()return 0;
}

对这段代码编译生成反汇编:
在这里插入图片描述
call指令是通过函数的符号表来定位函数的地址的
在这里插入图片描述
但是在C语言中,函数符号表中函数的命名规则就是原模原样地照搬源文件中的函数标识名。

C++符号表中的函数名修饰:
在符号表中,各个函数的命名都遵循一定的函数名修饰规则:
在g++编译环境(支持C++的编译器)中,符号表中的函数名经过修饰后变成【_Z+函数名长度+函数名+类型首字母】(这点和C语言的符号表中函数的命名规则完全不同)

在这里插入图片描述

C++(g++编译环境)这种名字修饰规则使得标识名相同,形参不同的函数在符号表中得到了区分,因此编译器在编译和链接的过程中就能根据函数调用语句具体的实参类型明确地找到相应重载函数的函数体的地址并访问函数体中的指令,实现了重载函数的调用。
C语言中不存在这种名词修饰规则,因此在符号表中标识名相同的函数的符号表命名也是相同的,所以编译器在编译和链接的过程中无法对同标识名函数进行区分,所以无法实现函数重载。

😍这期内容有一点点难理解,希望烙铁们能理解消化,有所收获哦!

总结🥰
以上就是 【C++】缺省参数&函数重载 的全部内容啦🥳🥳🥳🥳
本文章所在【C++初阶】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
前途很远,也很暗,但是不要怕,不怕的人面前才有路。💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

请添加图片描述

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

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

相关文章

Canal安装部署与测试

文章目录 第一章 Canal概述1.1 简介1.2 工作原理1.2.1 MySQL主备复制原理1.2.2 canal 工作原理 1.3 重要版本更新说明1.4 多语言 第二章 Canal安装部署2.1 准备2.2 canal安装 第三章 Canal和Kafka整合测试注意事项 第一章 Canal概述 Github地址&#xff1a;https://github.com…

使用goldengate 迁移Oracle到postgresql

环境&#xff1a; --源端&#xff1a; IP&#xff1a;10.0.4.16 hostname&#xff1a;tencent Oracle数据库版本&#xff1a;12.2.0.1.0 ogg for oracle版本&#xff1a;19.1.0.0.4 SID&#xff1a;orcl --目标端&#xff1a; IP&#xff1a;10.0.4.16 hostname&#…

ES6基础知识三:对象新增了哪些扩展?

一、属性的简写 ES6中&#xff0c;当对象键名与对应值名相等的时候&#xff0c;可以进行简写 const baz {foo:foo}// 等同于 const baz {foo}方法也能够进行简写 const o {method() {return "Hello!";} };// 等同于const o {method: function() {return "…

【MATLAB绘图】

MATLAB绘图函数&#xff1a;Plot函数详解 介绍 MATLAB是一种常用的科学计算和数据可视化工具&#xff0c;它提供了强大的绘图函数&#xff0c;使用户能够创建各种类型的图表和图形。 基本语法 plot函数的基本语法如下&#xff1a; plot(x, y)其中&#xff0c;x和y是长度相…

第八次CCF计算机软件能力认证

第一题&#xff1a;最大波动 小明正在利用股票的波动程度来研究股票。 小明拿到了一只股票每天收盘时的价格&#xff0c;他想知道&#xff0c;这只股票连续几天的最大波动值是多少&#xff0c;即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。 输入格式 输入…

OpenStack - 构建强大的云计算平台

简介 OpenStack是一个开源的云计算平台&#xff0c;它提供了一套用于构建和管理私有云和公有云的工具和服务。OpenStack的目标是提供可伸缩性、弹性和可靠性的云基础设施服务。 组件介绍 Nova&#xff08;计算服务&#xff09; Nova是OpenStack的计算服务组件&#xff0c;负…

子网划分和计网解题方法

子网的基本概念 子网是计算机网络中的一个逻辑单元&#xff0c;是由多个IP地址组成的网络。在计算机网络中&#xff0c;IP地址是一个32位的二进制数&#xff0c;用于标识网络上的设备。子网划分是将一个大型的IP地址网络划分为多个小的IP地址网络&#xff0c;每个小的IP地址网…

php-golang-rpc spiral/goridge库和php spiral/goridge2.4.5实践

golang 代码&#xff1a; package main import ( "fmt" "net" "net/rpc" "github.com/spiral/goridge/v2" ) type App struct{} func (*App) Hi(name string, r *string) error { *r fmt.Sprintf("hello %s!", name) re…

至臻画质、高清带感,这就是声网实时高清·超级画质

至臻画质、高清带感&#xff0c;这就是声网实时高清超级画质 7月26日&#xff0c;实时互动云服务商声网在北京举办“实时高清超级画质”发布会。 实时高清超级画质是声网面向实时视频场景提供的一套以提升视频画质和使用体验为核心的解决方案&#xff0c;包含至臻画质、美颜悦…

uni-app:实现账号密码登录,并且实现当页面登录过该账号在下次登录时无需再输入账号密码(本地缓存实现)

效果 前端代码 一、完整代码 <template><view><view class"all"><view class"title"><image :src"title_login" alt"图片损坏" /></view><form class"login-form" submit"fo…

TSDB - VictoriaMetrics 技术原理浅析

一、前言 在监控领域&#xff0c;通常需要指标存储组件TSDB&#xff0c;目前开源的TSDB组件比较多&#xff0c;各个组件性能、高可用性、维护成本等等各有差异。本文不分析选型问题&#xff0c;重点讲解VictoriaMetrics&#xff08;后面简称为vm&#xff09;。 有兴趣的朋友建议…

回调函数的使用

使用例子 #include<stdio.h>int Callback_1(int x) // Callback Function 1 {printf("Hello, this is Callback_1: x %d ", x);return 0; }int Callback_2(int x) // Callback Function 2 {printf("Hello, this is Callback_2: x %d ", x);return…

吉林大学计算机软件考研经验贴

文章目录 简介政治英语数学专业课 简介 本人23考研&#xff0c;一战上岸吉林大学软件工程专硕&#xff0c;政治72分&#xff0c;英一71分&#xff0c;数二144分&#xff0c;专业课967综合146分&#xff0c;总分433分&#xff0c;上图&#xff1a; 如果学弟学妹需要专业课资料…

网络—Linux网络收发包的流程

一、接收网络包的过程 引言 网卡是计算机里的一个硬件&#xff0c;专门负责接收和发送网络包&#xff0c;当网卡接收到一个网络包后&#xff0c;会通过 DMA 技术&#xff0c;将网络包写入到指定的内存地址&#xff0c;也就是写入到 Ring Buffer &#xff0c;这个是一个…

Mysql执行计划字段解释

文章目录 一、前言二、如何查看执行计划三、执行计划各字段解释四、select_type4.1、SIMPLE&#xff08;简单查询&#xff09;4.1.1、简单的单表查询4.1.2、多表连接查询 4.2、PRIMARY&#xff08;主查询&#xff09;4.2.1、包含复杂子查询的外层查询4.2.2、UNION语句中的第一个…

【N32L40X】学习笔记02-gpio输入实例

GPIO 使用实例 该函数库的目的就是在统一的敌方配置gpio&#xff0c;将配置的不同项放置在一个结构体内部没得io口使用一个枚举来定义一个gpio pin的别名 gpio输入实例 key.c #include <stdio.h> #include "key/bsp_key.h" #include "./key/bsp_lib_i…

自动化测试框架unittest与pytest的区别!

引言 前面文章已经介绍了python单元测试框架&#xff0c;大家平时经常使用的是unittest&#xff0c;因为它比较基础&#xff0c;并且可以进行二次开发&#xff0c;如果你的开发水平很高&#xff0c;集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别&…

可解释的 AI:在transformer中可视化注意力

Visualizing Attention in Transformers | Generative AI (medium.com) 一、说明 在本文中&#xff0c;我们将探讨可视化变压器架构核心区别特征的最流行的工具之一&#xff1a;注意力机制。继续阅读以了解有关BertViz的更多信息&#xff0c;以及如何将此注意力可视化工具整合到…

Debian12中为python3配置虚拟环境及在Pycharm中使用虚拟环境

在Debian 12中&#xff0c;python默认为python 3.11。 基于应用&#xff0c;现需设置虚拟环境。 1.安装venv模块 从python3.3开始&#xff0c;配置python虚拟环境&#xff0c;可用venv模块&#xff0c;更加方便了。 执行命令&#xff1a; #apt install python3.11-venv 2.…

Java虚拟机——前端编译优化

Java的编译期是有上下文语境影响的&#xff0c;不同语境下可以指不同的过程&#xff1a; 可以是前端编译器&#xff0c;把*.java文件转变成*.class文件的过程。 JDK的Javac、Eclipse JDT中的增量式编译器 可以指Java虚拟机的即时编译器&#xff08;JIT编译器&#xff09;在运…