C++关于函数参数的分析与函数重载进阶教程

简介: 函数重载概述作用:函数名可以相同,提高复用性函数重载满足条件:• 同一个作用域下• 函数名称相同• 函数参数类型不同 或者 个数不同 或者 顺序不同注意: 函数的返回值不可以作为函数重载的条件

函数提高

函数默认参数

分析

在C++中,函数的形参列表中的形参是可以有默认值的。

语法:返回值类型  函数名 (参数= 默认值){}

示例:

intfunc(inta, intb=10, intc=10) {

   returna+b+c;

}

intfunc2(inta=10, intb=10);

intfunc2(inta, intb) {

   returna+b;

}

intmain() {

   cout<<"ret = "<<func(20, 20) <<endl;

   cout<<"ret = "<<func(100) <<endl;

   system("pause");

   return0;

}

PS:如果向函数传了数据就用所传的数据,如果没有传则用函数形参列表中的默认值。

注意事项

  1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值

❌错误写法:b之后必须都有默认参数:c和d也必须有默认参数

网络异常,图片无法展示
|

✔正确写法

网络异常,图片无法展示
|

  1. 如果函数声明有默认值,函数实现的时候就不能有默认参数

✔正确写法

网络异常,图片无法展示
|

网络异常,图片无法展示
|

函数占位参数

C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置

语法:返回值类型 函数名 (数据类型){}

在现阶段函数的占位参数存在意义不大,但是后面的课程中会用到该技术

示例:

//函数占位参数 ,占位参数也可以有默认参数

voidfunc(inta, int) {

   cout<<"this is func"<<endl;

}

intmain() {

   func(10,10); //占位参数必须填补

   system("pause");

   return0;

}

函数重载

函数重载概述

作用:函数名可以相同,提高复用性

函数重载满足条件:

  • 同一个作用域下
  • 函数名称相同
  • 函数参数类型不同  或者 个数不同 或者 顺序不同

注意:  函数的返回值不可以作为函数重载的条件

示例:

//函数重载需要函数都在同一个作用域下

voidfunc()

{

   cout<<"func 的调用!"<<endl;

}

voidfunc(inta)

{

   cout<<"func (int a) 的调用!"<<endl;

}

voidfunc(doublea)

{

   cout<<"func (double a)的调用!"<<endl;

}

voidfunc(inta ,doubleb)

{

   cout<<"func (int a ,double b) 的调用!"<<endl;

}

voidfunc(doublea ,intb)

{

   cout<<"func (double a ,int b)的调用!"<<endl;

}

//函数返回值不可以作为函数重载条件

//int func(double a, int b)

//{

//  cout << "func (double a ,int b)的调用!" << endl;

//}

intmain() {

   func();

   func(10);

   func(3.14);

   func(10,3.14);

   func(3.14 , 10);

   

   system("pause");

   return0;

}

案例刨析

参数个数不同,图一为0个图二为1个

网络异常,图片无法展示
|

网络异常,图片无法展示
|

参数类型不同

网络异常,图片无法展示
|

参数顺序不同

网络异常,图片无法展示
|

函数重载注意事项

  • 引用作为重载条件
  • 函数重载碰到函数默认参数

示例:

//函数重载注意事项

//1、引用作为重载条件

voidfunc(int&a)

{

   cout<<"func (int &a) 调用 "<<endl;

}

voidfunc(constint&a)

{

   cout<<"func (const int &a) 调用 "<<endl;

}

//2、函数重载碰到函数默认参数

voidfunc2(inta, intb=10)

{

   cout<<"func2(int a, int b = 10) 调用"<<endl;

}

voidfunc2(inta)

{

   cout<<"func2(int a) 调用"<<endl;

}

intmain() {

   

   inta=10;

   func(a); //调用无const

   func(10);//调用有const

   //func2(10); //碰到默认参数产生歧义,需要避免

   system("pause");

   return0;

}

案例刨析

引用作函数重载条件:函数参数类型不同

网络异常,图片无法展示
|

网络异常,图片无法展示
|

图一二这种情况表面属于重载,但实际上会报错!所以写函数重载时尽量避免使用默认参数!图三就可以正常运行。

网络异常,图片无法展示
|

网络异常,图片无法展示
|

网络异常,图片无法展示
|

注意:函数的返回值不可以作为函数重载的条件,条件见上面三条

网络异常,图片无法展示
|

导图

目录
相关文章
|
9天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
2月前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
72 4
|
2月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
113 5
|
3月前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
31 3
|
3月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
3月前
|
算法 数据挖掘 Shell
「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda
还在为生信软件的安装配置而烦恼?micromamba(micromamba是mamba包管理器的小型版本,采用C++实现,具有mamba的核心功能,且体积更小,可以脱离conda独立运行,更易于部署)帮你解决!
91 1
|
3月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【10月更文挑战第8天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
3月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
113 6
|
3月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
51 0
|
3月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
84 1