前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初谈C++:缺省参数&&函数重载

初谈C++:缺省参数&&函数重载

作者头像
南桥
发布2024-01-31 10:37:13
840
发布2024-01-31 10:37:13
举报
文章被收录于专栏:南桥谈编程南桥谈编程

缺省参数

概述

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

举例:

代码语言:javascript
复制
void fun(int a = 5)
{
	cout << a << endl;
}

int main()
{
	fun(10); //传参,使用指定的参数-->10

	fun(); //没有传参,使用参数的默认值

	return 0;
}

在这串代码中,在fun函数中有一个形参int a = 5,主函数中,fun(10),传了参数,于是在fun函数中就是用传的参数;而fun()中没有传参数,就是用参数的默认值。

输出结果:

代码语言:javascript
复制
10
5
在这里插入图片描述
在这里插入图片描述

缺省参数的分类

全缺省
代码语言:javascript
复制
void Func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

int main()
{
	Func();
	return 0;
}

结果:

代码语言:javascript
复制
a = 10
b = 20
c = 30

主函数中Func()没有任何参数,则全部使用缺省值。

半缺省参数
代码语言:javascript
复制
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(1, 2, 3);
	Func(1, 2);
	Func(1);

	return 0;
}

结果:

代码语言:javascript
复制
a = 1
b = 2
c = 3

a = 1
b = 2
c = 30

a = 1
b = 20
c = 30
在这里插入图片描述
在这里插入图片描述

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

Func(1, 2)是给了第一个参数和第二个参数值,,而没有给第三个参数值 Func(1)只给第一个参数传了值 不存在只给第一个参数和第三个参数传值的说法,这种是错误的,只能从左至右一次给出。

注意

  • 缺省参数不能在函数声明和定义中同时出现
代码语言:javascript
复制
//test.h
void Func(int a = 10);
// test.cpp
void Func(int a = 20)
{}

如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值

  • 缺省值必须是常量或者全局变量

函数重载

在汉语中,一个词语会有多种意思,人们可以结合语境可以判断一个词的意思。如“方便”一词:”你现在方便嘛”、“我要去方便一下”。

概述

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

重载类型不同

参数类型不同
代码语言:javascript
复制
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()
{
	cout << Add(2, 3) << endl;
	cout << Add(2.0, 3.0) << endl;
}

运行结果:

在这里插入图片描述
在这里插入图片描述

函数名称同为Add,但是定义此函数的类型不同,一个是int,另一个是double,在主函数中调用的Add函数,如果传的参数为int型,那么调用int Add(int left, int right);如果传的参数为double型,那么调用double Add(double left, double right)

编译器会根据参数类型,自动选择调用的函数

参数个数不同
代码语言:javascript
复制
void fun()
{
	cout << "f()" << endl;
}
void fun(int a)
{
	cout << "f(int a)" << endl;
}
int main()
{
	fun();
	fun(1);
	return 0;
}

运行结果:

在这里插入图片描述
在这里插入图片描述

主函数中,第一个调用的函数fun(),没有参数,第二个调用的函数fun(1)传了一个参数,属于参数不同的情况。

但是在无参调用时,出现了歧义,对于两个fun函数来说,都可以不传参。

参数类型顺序不同
代码语言:javascript
复制
void Text(int a, char b)
{
	cout << "Text(int a,char b)" << endl;
}
void Text(char b, int a)
{
	cout << "Text(char b, int a)" << endl;
}

int main()
{
	Text(1, 'a');
	Text('a', 1);
	return 0;
}

运行结果:

在这里插入图片描述
在这里插入图片描述

编译器自己会根据传入的参数类型不同而选择相应的函数。

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

为什么C++支持函数重载,而C语言不支持函数重载呢?

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。

预处理是展开头文件/宏替换/条件编译/去掉注释

编译是检查语法,转成汇编代码

汇编是把汇编代码转成二进制机器码

在这里插入图片描述
在这里插入图片描述

实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们 可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标 文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。

如何处理这一问题?

链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就 会到b.o的符号表中找Add的地址,然后链接到一起。每个编译器都有自己的 函数名修饰规则。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缺省参数
    • 概述
      • 缺省参数的分类
        • 全缺省
        • 半缺省参数
      • 注意
      • 函数重载
        • 概述
          • 重载类型不同
            • 参数类型不同
            • 参数个数不同
            • 参数类型顺序不同
        • C++支持函数重载的原理
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档