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;

}

案例刨析

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

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

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

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

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

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

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

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

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

导图

目录
相关文章
|
11天前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。 1. Perf 基础 1.1 Perf 简介 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件 1.2 Perf的安装 ubuntu 18.04: sudo apt install linux-tools-common linux-tools-4.15.0-106-gen
15 2
|
1月前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
16 4
C++函数重载
|
24天前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
15 1
|
1月前
|
C++
c++常见函数及技巧
C++编程中的一些常见函数和技巧,包括生成随机数的方法、制表技巧、获取数字的个位、十位、百位数的方法、字符串命名技巧、避免代码修改错误的技巧、暂停和等待用户信号的技巧、清屏命令、以及避免编译错误和逻辑错误的建议。
18 6
|
7天前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
21 0
|
1月前
|
存储 C++
c++学习笔记05 函数
C++函数使用的详细学习笔记05,包括函数的基本格式、值传递、函数声明、以及如何在不同文件中组织函数代码的示例和技巧。
27 0
c++学习笔记05 函数
|
1月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
1月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
30 0
|
1月前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
1月前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数