【C++精华铺】2.C++入门 缺省参数、函数重载

举报
子亦半截诗 发表于 2023/08/09 01:24:25 2023/08/09
【摘要】 ​目录1. 缺省参数(默认实参)1.1 全缺省1.2 半缺省1.3 含有缺省参数的函数的声明和定义2. 函数重载2.1  函数重载的判定2.2 函数重载的原理——函数名修饰规则1. 缺省参数(默认实参)        有些函数在定义的时候,我们会给形参列表赋予一个初始值,这个初始值我们称之为缺省参数或者默认实参。而我们在调用含有缺省参数的函数时我们可以省略该实参也可以不省略,如果省略就会默认...

目录

1. 缺省参数(默认实参)

1.1 全缺省

1.2 半缺省

1.3 含有缺省参数的函数的声明和定义

2. 函数重载

2.1  函数重载的判定

2.2 函数重载的原理——函数名修饰规则




1. 缺省参数(默认实参)

        有些函数在定义的时候,我们会给形参列表赋予一个初始值,这个初始值我们称之为缺省参数或者默认实参。而我们在调用含有缺省参数的函数时我们可以省略该实参也可以不省略,如果省略就会默认将默认实参作为自己的字面值。(缺省值必须是常量或者全局变量)

#include<iostream>
using namespace std;

void print(int a = 0,int b = 1)
{
	cout << a << ' ' << b << endl;
}

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

输出结果:

0 1 

而由上我们又引出了全缺省和半缺省的概念如下。

1.1 全缺省

        全缺省顾名思义就是给形参列表中的所有形参都给一个默认实参,而我们在调用的时候就可以省略实参。但是我们在省略的时候只可以从右往左依次省略避免给编译器造成歧义导致出错。

void print(int a = 1, int b = 1, int c = 1)
{
	cout << a << ' ' << b << ' ' << c << endl;
}
int main()
{
	print(0, 0, 0);
	print(0, 0);
	print(0);
	print();
	return 0;
}

1.2 半缺省

        半缺省其实就是部分缺省,给部分参数赋予默认实参,但在缺省的时候要遵从一个规定便是:任意一个缺省参数的右边所有形参都必须具有默认参数。

void print(int a = 1, int b = 1, int c = 1);
void print(int a, int b = 1, int c = 1);
void print(int a, int b, int c = 1);

1.3 含有缺省参数的函数的声明和定义

        含有缺省参数的函数在声明的时候要注意声明的时候定义和声明如果是分开的话缺省参数必须写在声明里。

void print(int a = 1, int b = 1, int c = 1);
void print(int a, int b, int c){}

2. 函数重载

2.1  函数重载的判定

        函数重载是C++中的一种特殊语法,即允许在同一作用域中声明几个功能类似的同名函数,这些函数的形参列表(参数个数、参数类型、类型顺序)不同,以此来处理实现功能类似但是类型不同的问题。(但需要注意函数的返回类型不作为函数重载的判定条件)

int add(int a,int b)
{
	return a + b;
}
double add(double a, int b)
{
	return a + b;
}
double add(int a, double b)
{
	return a + b;
}

2.2 函数重载的原理——函数名修饰规则

        在我们程序的链接阶段,链接器会对函数进行寻址,但是重载的函数函数名都相同,链接器无法知道调用的是哪个函数,所以编译器会对重载的函数进行函数名修饰,而不同编译器的函数名修饰规则都不相同,windows下vs的函数名修饰规则较为复杂且不容易理解,而Linux下的函数名修饰规则(_Z+函数名长度+函数名+形参类型首字母)相对简单易懂,所以我会以Linux为例来给大家讲解。

编辑

         仔细对比上图我们就可以看到,在Linux下gcc对重载的函数进行了函数名修饰,将函数参数的类型信息添加到了修改后的名字中,call指令也会按照修饰后的函数名称进行寻址。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。