【C++初阶(二)】缺省参数以及函数重载

这篇具有很好参考价值的文章主要介绍了【C++初阶(二)】缺省参数以及函数重载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++初阶之路⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习排序知识
  🔝🔝


【C++初阶(二)】缺省参数以及函数重载,C++初阶之路,c++,开发语言

1. 前言

写C语言代码的时候
特别是在写数据结构时:

经常忘记传函数的参数
或者当前不需要什么参数

C++增加了缺省参数来解决这个问题

而为了解决相似功能的函数的函数名问题

C++增加了函数重载来解决这个问题

本篇文章将简单介绍缺省参数
并着重讲解函数重载的底层原理!

【C++初阶(二)】缺省参数以及函数重载,C++初阶之路,c++,开发语言


2. 缺省参数

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

缺省参数分类:

  1. 全缺省
  2. 半缺省

2.1 全缺省

类似于这样的代码:

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

全缺省指的是函数的所有参数都给缺省值

有四种调用此函数的方式:

  1. 什么都不传:
Func();

此时系统默认a,b,c的值分别为
10 - 20 - 30

  1. 只传一个参数:
Func(15);

此时,a的值为15
而系统默认b,c的值为
:20-30

  1. 传两个参数:
Func(15,25);

此时a,b的值为:15 - 25
系统默认c的值为30

  1. 三个参数都传:
Func(15,25,35);

此时a,b,c的值为:15-25-35


注意:传参不能写成这种形式:

Func(,25,);
Func(,,35);
Func(,25,35);
Func(15,,35);

2.2 半缺省

半缺省类似于这种形式:

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

只要有参数没有给缺省值
那么它就是半缺省的

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现
  3. 缺省值必须是常量或者全局变量

比如下面这样定义半缺省是不行的:

void Func1(int a=10,int b,int c);
void Func2(int a,int b=20,int c);
//有缺省值的前提是它的右边的参数都有缺省值

3. 函数重载概念

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

这里使用了一语双关.
而函数重载的概念和它类似:

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

举个例子:

void func(int i,char ch) //函数1
{
	//...
}

void func(char ch,int i) //函数2
{
	//...
}

函数1和2可以同时存在
并且它们不是同一个函数


4. 几种不同类型的函数重载

总结三种支持函数重载的情况:

  1. 参数类型不同
int Add(int left, int right)
{
	return left + right;
}
double Add(double left, double right)
{
	return left + right;
}
  1. 参数个数不同
void f()
{
 cout << "f()" << endl;
}
void f(int a)
{
 cout << "f(int a)" << endl;
}
  1. 参数类型顺序不同
void f(int a, char b)
{
 cout << "杭州电子科技大学" << endl;
}
void f(char b, int a)
{
 cout << "圣光机联合学院" << endl;
}

(注意:下面这种不属于函数重载):

short Add(short x,short y)
{
	return x+y;
}
int Add(short x,short y)
{
	return x+y;
}

因为它们参数类型,数量,顺序都一样
只是返回值不同,不构成函数重载!


5. C++如何支持函数重载?

在C/C++中,一个程序要运行起来
需要经历以下几个阶段:

  • 预处理
  • 编译
  • 汇编
  • 链接

因为c++区别于c在这几个过程中
的差别,所以使C++能够支持函数重载


5.1 C程序为什么不支持函数重载?

定义两个源文件和一个头文件来解释:

  • func.h
  • func.c
  • main.c

在.h文件声明两个函数

int func(int x,int y);
int func(int x,double y);

这三个文件会经历以下过程:

  1. 预处理阶段

主要内容:头文件展开,宏替换
条件编译,去掉注释

这个过程结束后,func.h被展开了
main.c和func.c源文件变成了:
func.i和main.i文件

  1. 编译阶段

主要内容:语法检查和生成汇编代码

这个过程结束后,func.i和main.i
文件变成了func.s和main.s文件
(此文件中为汇编代码)

  1. 汇编阶段

主要内容:将汇编代码转换成二进制码
以便机器能够读懂

这个过程结束后,func.s和main.s
文件变成了func.o和main.o文件

注:前面的过程只用了解,真正的主角在下面!

  1. 链接过程
    func.o和main.o文件
    以及链接过程是这部分的重中之重

5.2 C程序的链接过程

func.c到func.o和main.c到main.o
都是单线程的

链接过程:

.o的目标文件会合并到一起
其次还需找一些只给了声明的函数
的函数地址

而每一个.o文件都有一个符号表
符号表中存放函数的地址

当main文件要调用这个函数时
会去符号表中找函数的地址

【C++初阶(二)】缺省参数以及函数重载,C++初阶之路,c++,开发语言

而符号表中两个func函数的地址
编译器不知道应该调用哪个
所以c程序不支持函数重载!


5.3 C++函数名修饰规则

相比起C程序而言,C++新增了一个
函数名修饰规则来支持函数重载

这个规则就是将函数的参数带入符号表
所以参数的类型,数量,顺序不同
代表的是不同的函数,找地址时就不会出错!

我们在C++的汇编代码中找到了
这两个函数对应的部分:

【C++初阶(二)】缺省参数以及函数重载,C++初阶之路,c++,开发语言

综上所述:

函数参数的类型,数量,顺序不同
那么对应在符号表中的名字就不一样
main文件再去找函数地址时就不会冲突

对比c程序:
c程序符号表中只有一个函数名
函数参数没有参与进来
所以C程序不支持相同函数名的函数


6. 总结以及拓展

前面很多过程只是为了
后面的链接.o文件打基础
所以前面的听不懂也没关系

只需要知道C++有函数名修饰规则
c++的.o文件的符号表的函数名
和函数参数相关
而c程序的符号表和参数无关!

【C++初阶(二)】缺省参数以及函数重载,C++初阶之路,c++,开发语言

拓展:
C/C++函数调用约定和名字修饰规则
有兴趣好奇的同学可以看看里面
有对vs下函数名修饰规则讲解
C/C++约定文章来源地址https://www.toymoban.com/news/detail-523803.html


🔎 下期预告:引用和内联函数 🔍

到了这里,关于【C++初阶(二)】缺省参数以及函数重载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++初阶】C++基础(上)——C++关键字、命名空间、C++输入&输出、缺省参数、函数重载

    目录 1. C++ 2. 命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C++输入输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C++支持函数重载的原理——名字修饰(name Mingling) 5.3 extern \\\"C\\\" ❀❀❀ 没有坚持的努力,本质上并没有多

    2024年02月15日
    浏览(58)
  • 【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】十一、归并排序(比较排序)的讲解和实现 (递归版本 + 非递归版本 -- C语言实

    2024年02月05日
    浏览(52)
  • 【C++初阶】关键字&命名空间&缺省函数&函数重载入门必看!!!超详解!!!

     ========================================================================= 主页点击直达: 个人主页 我的小仓库:代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记: 初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记: LeetCode刷题 算法: 算法专栏  C++头疼记: C++专栏 计算机

    2024年02月07日
    浏览(48)
  • 【C++】缺省参数与函数重载

    👀樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》 🌝 每一个不曾起舞的日子,都是对生命的辜负 本篇文章博主将带你学习 缺省参数 与 函数重载 ,一些需要注意的点博主都会特别标注以便大家学习。 欢

    2024年02月08日
    浏览(35)
  • 【C++】入门 --- 缺省参数&函数重载

    缺省参数是声明或定义函数时 为函数的参数指定一个缺省值 。 在调用该函数时, 如果没有指定实参则采用该形参的缺省值 ,否则使用指定的实参。 🌰举个栗子👇 🚨 注意: 缺省值(函数形参的默认值)不能同时在函数声明和函数定义中给出(缺省参数不能在函数声明和定义

    2024年02月15日
    浏览(36)
  • C++入门:函数缺省参数与函数重载

    目录 1.函数缺省参数 1.1 缺省参数概念 1.2 缺省参数分类 2.函数重载 2.1 函数重载概念 2.2 C++支持函数重载的原理 缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参,有点备胎的意

    2024年02月12日
    浏览(33)
  • 【初识C++】(缺省参数和函数重载)

    缺省参数是在函数的声明中给定参数一个指定的值。 如果传参没有给定参数,那就按照声明中默认的缺省值,如果给定了参数,那就按照给定的参数值。 比如: 对于Func函数如果没有给定参数,那就按照默认的缺省值来赋值。如果给定了参数,那就按照给定的参数进行赋值。

    2024年02月01日
    浏览(37)
  • 【C++】命名空间、缺省参数和函数重载

    在一个大型的项目中,不同成员写的程序中会不可避免的带来 命名冲突 的问题,这种情况下命名空间可以很好的解决这种命名冲突大的问题,它可以用来避免不同的库或模块中的名称(name)发生冲突。 名称可以是变量、函数、类、结构、枚举等等。此外,命名空间可以让我

    2024年02月17日
    浏览(45)
  • 【开懂C++】命名空间 函数重载 缺省参数

    在编写C语言代码时,当工程较大时,很容易产生变量命名冲突的情况——一般有两种冲突的情况 1.变量名与库中的函数名、冲突 。 2.工程模块化搭建时不同文件的命名冲突 。 而C++为了优化这一缺陷,提出了命名空间的概念。 命名空间使用的是 namespace ,命名空

    2023年04月18日
    浏览(91)
  • C++中命名空间、缺省参数、函数重载

    目录 1.命名空间 2.缺省参数 3.函数重载 在C++中定义命名空间我们需要用到namespace,后面跟上命名空间的名字,结构框架有点类似结构体(如图所示) 上面的代码我一一进行讲解: 1.我们先来说第三行和main函数中的代码意思,第三行代码的意思是展开std库的空间,std是

    2024年01月23日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包