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

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

目录

前言

1. 缺省参数

 1.1 什么是缺省参数

 1.2 缺省参数的分类

     1.2.1 全缺省参数

 1.2.2 半缺省参数

2. 函数重载

 2.1 什么是函数重载

 2.2 缺省参数与函数重载

 2.3 函数重载的使用

 3. C++支持函数重载的原因

 总结



前言

        在学习C语言时我们就会发现,C语言中存在的许多规则使得C语言在使用时非常的不方便,例如在函数调用时必须要传参没有默认值,函数不可以重名等等问题,C++作为C的改进版,对C语言的缺陷进行了改进,同时也兼容C的语法。在C++中上述问题都得到了解决,也就是缺省参数和函数重载,接下来我将向大家详细介绍C++的缺省参数和函数重载。

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

1. 缺省参数

 1.1 什么是缺省参数

         缺省参数是指在函数定义时为参数提供默认值,使得在调用函数时可以选择性地省略该参数。当调用函数时省略了对应的参数,函数会使用默认值来代替。

 比如:

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

int main()
{
	Func();//没有传参时使用参数的默认值
    Func(2);//传参时使用的是指定参数

	return 0;
}

 1.2 缺省参数的分类

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

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

 1.2.2 半缺省参数

        半缺省参数是指在函数的部分参数设置了默认值,使得在调用函数时可以省略这些参数。比如:

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

int main()
{
	Func(1,2);
    
	return 0;
}

 使用注意

  •  缺省参数中,半缺省缺省值只能从右往左进行缺省,且必须是连续的

 比如:

int main()
{
	Func( ,1,2);//缺省位置从右向左,不可以中断
    
	return 0;
}
  •  缺省参数声明和定义不能同时给

 比如:

//定义 fun.c
void Func(int a = 10)
{
    cout << "a = " << a << endl;
}

//声明 fun.h
void Func(int a = 2);

        声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定该用那个缺省值。应该在声明中给,如果只在定义中给,那么在其他文件调用时就无法达到缺省的效果。(函数声明是告诉编译器函数的存在,不在声明中写,那么在其他接口调用时,编译器就不会认为有默认值)。

  • 缺省值必须是常量或者全局变量
  •  C语言不支持

2. 函数重载

        自然语言中,一个词可以有多重含义(一词多义),人们可以通过上下文来判断该词真实的含义,相同的名称,却有不同的作用与意义。在C++中函数重载也是如此。

 2.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;
}
int main()
{
	Add(1, 1);
	Add(3.14, 3.62);
	return 0;
}

 定义两个同名的Add函数,在进行函数调用时,编译器会根据传递的参数来选择调用哪个函数。

 但如果一个传int类型,一个传double类型就会出现报错:

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

 传进去的参数与参数列表里的参数不匹配。

 2.2 缺省参数与函数重载

         有缺省参数也可以构成重载,但在使用时需要注意避免造成歧义。比如:

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

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

         在调用fun不传参时,fun()和fun(int a=0)都符合条件,这样就存在二义性,编译器在调用时不知道该调用哪一个。在结合使用时可以使用,但要避免类似这种二义性情况(尽量不要这样使用)。

 2.3 函数重载的使用

         函数重载可以依据参数类型不同而进行匹配,并选择调用函数,参数类型不同可分为:参数类型不同,参数个数不同,参数顺序不同。

//1.参数类型不同
int fun(int a)
{
	cout << "int fun(int a)" << endl;
	return a;
}
double fun(double b)
{
	cout << "double fun(double b)" << endl;
	return b;
}
// 2、参数个数不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void func(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void func(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}

 这些都可以构成函数重载。

但要注意:

参数相同时,返回值不参与重载的规则

比如:

int f(int a)
{
	return 0;
}
double f(int a)
{
	return 2.1;
}

        如果两个函数的函数名相同、参数也相同,仅依靠返回值不同,是无法构成函数重载的(存在二义性)。

 3. C++支持函数重载的原因

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

在 C/C++ 中,要运行一个程序,需要经过:编译和链接两大过程。

 详细可见:程序员进阶之路:程序环境和预处理

 程序大概执行流程:

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

         C语言在编译阶段会产生一个符号表,在链接函数地址时,C语言通过符号表(函数名)去找。所以C语言不存在同名函数。

         C++在编译时会通过特殊修饰产生独特的字符(地址),通过地址寻找函数,以Linux环境下为例更为直观:

 Linux函数名修饰规则:

 _Z  函数名字符个数   函数名  参数首字母

 以 fun(int a,char b) ,fun(char b,int a) 为例,修饰后:_Z3funic、_Z3funci

 我们通过VS调试也可以看到,test.s文件如下:

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

 不同的编译器有不同的修饰规则。这也就是C++为什么可以支持函数重载。


 总结

         缺省参数和函数重载是C++语言中非常有用的特性,它们可以帮助我们更好地组织和管理代码。在学习和使用这两个特性时,我们需要注意一些细节,以确保代码的正确性和可读性。以上便是本期的全部内容,希望对你有所帮助。最后感谢阅读!文章来源地址https://www.toymoban.com/news/detail-723591.html

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

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

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

相关文章

  • 【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年01月23日
    浏览(44)
  • 【C++杂货铺】缺省参数、函数重载

     缺省参数是 声明或定义函数时为函数的参数指定一个缺省值 。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。  上面代码在 fun 函数的形参部分给了缺省值10,这意味着在调用 fun 函数的时候可以传参,也可以不传参,如果传参了那形参

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

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

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

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

    2023年04月18日
    浏览(84)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包