一、函数的重载
1、基本概念
C语言在“同一份程序”中是不能有两个同名函数,C++可以有
(函数重载:编译的时候,可以重复载入多个相同的函数代码) 多个相同名字的函数。
作用:
1)当你要实现 多个大同小异的功能时,譬如 都是字符串操作函数 我们可以利用函数重载语法,就不需要再去想名字了
strcpy strctrl
strcat 函数重载: strctrl
strlen strctrl
strcmp strctrl
解决函数命名缺乏的问题
2)体现接口的丰富性
如何实现函数重载?具体C++语法要求如下:
1:函数名称必须相同
2:参数列表必须不同(个数不同 或者 类型不同 或者 参数排列顺序不同等)
3:函数的返回类型可以相同也可以不相同。仅仅返回类型不同不足以成为函数的重载条件。
作用:
解决函数名字资源问题,注意什么时候才能让两个函数的名字一样? 字符串操作函数: strcpy strlen strcmp...
体现了 一个接口 多种方法的好处
本质:
在编译的汇编阶段根据形参的类型来决定要调用的函数。---- 静态绑定 静态多态
Fun();
Fun(int a);
Fun(char b);
Fun(char *p);
作用:1、解决函数命缺乏的问题,2、体现接口的丰富性
多态:函数重载体现了函数的多态性。多态性可以简单地概括为“一个接口,多种方法”,程序在编译时决定调用的函数,它是面向对象编程领域的核心概念。属于C++的静态绑定概念!
② 重载示例
例子1:
#include <iostream>
#include <cstring>
using namespace std;
//函数重载的例子
void Data(int int_data);
void Data(string str_data);
void Data(int int_data)
{
if(int_data % 2 == 0)
cout<<"是偶数"<<endl;
else
cout<<"是奇数"<<endl;
return;
}
void Data(string str_data)
{
cout<<"输出的是string类型的数据为:";
cout<<str_data<<endl;
return;
}
int main()
{
int a = 30;
string s1 = "my name is Bardb";
Data(a);
Data(s1);
return 0;
}
例子2:
#include <iostream>
using namespace std;
void Fun();
void Fun(int a);
void Fun(char s);
void Fun(int a1, char s1);
void Fun(char s2, int a2);
void Fun()
{
cout<<"这个函数是没有数据的"<<endl;
}
void Fun(int a)
{
cout<<a<<endl;
}
void Fun(char s)
{
cout<<s<<endl;
}
void Fun(int a1, char s1)
{
cout<<"a1的值为:";
cout<<a1<<endl;
cout<<"s1的值为:";
cout<<s1<<endl;
}
void Fun(char s2, int a2)
{
cout<<"a2的值为:";
cout<<a2<<endl;
cout<<"s2的值为:";
cout<<s2<<endl;
}
int main()
{
Fun();
Fun(10);
Fun('B');
Fun(11,'a');
Fun('r', 12);
return 0;
}
例子3:
#include <iostream>
#include <cstring>
using namespace std;
//判断整数是奇数还是偶数,判断两个整数的谁大,输出字符串的数据级长度
void Fun(int A);
void Fun(int a, int b);
void Fun(string s1);
void Fun(int A)
{
if(A % 2 == 0)
cout<<"是偶数"<<endl;
else
cout<<"是奇数"<<endl;
}
void Fun(int a, int b)
{
a>b?cout<<"a>b"<<endl:cout<<"a<b"<<endl;
}
void Fun(string s1)
{
cout<<"s1为:"<<s1<<",s1的长度为:"<<s1.size()<<endl;
}
int main()
{
Fun(10);
Fun(12, 15);
Fun("Bardb");
return 0;
}
例子4:
#include <iostream>
using namespace std;
//获取用宏来表示PI
#define PI 3.1415926
//用函数重载计算长方形的体积,和计算圆柱的体积
int Volume(int l, int w, int h);
double Volume(int r, int h);
//计算长方体的体积
int Volume(int l, int w, int h)
{
return l*w*h;
}
//计算圆柱体的体积
double Volume(int r, int h)
{
//const double PI = 3.1415926;
return PI*r*r*h;
}
int main()
{
int res = Volume(3,4,5);
double res1 = Volume(6,7);
cout<<res<<endl;
cout<<res1<<endl;
return 0;
}
二、函数的默认参数(缺省实参数据)
1、概念
问题引入:C++中有没有一种语法支持,调用函数的时候不需要传参?
C中,如果函数有形参,在调用的时候必须传参,但是在C++中,函数的调用,
如果函数的形参是默认参数,则调用的时候可以不传参。
作用:
在函数调用的时候提高灵活性,在调用的时候可以不传参使用默认参数,当然程序员也可以自定义传参。
以下是实现默认参数的语法书写:
在""""声明函数"""""的时候可以先赋予函数形参的默认值(初始化)。所谓默认值就是在调用时,可以不写某些参数的值,使用默认值
编译器会自动把默认值传递给调用语句中,这也是默认参数的作用。
》》》》》》》》》》》》注意《《《《《《《《《《《《《
1:在函数的声明设置默认值即可,定义的时候不需要设置默认值;
2:将变量作引用类型参数的默认值,这个变量必须是已经声明且是全局变量
注意它的作用是:在调用函数时提高了灵活性。
注意:将默认参数赋值的是变量,那么该变量需要提前定义⭐
函数默认参数例子:
#include <iostream>
using namespace std;
//函数的默认参数例子
void printf_message(int a, char s1, const char * str = "Bardb");
void printf_message(int a, char s1, const char * str)
{
cout<<"a="<<a<<",s1="<<"my name is:"<<str<<endl;
return;
}
int main()
{
printf_message(10,'A');
return 0;
}
2、默认参数 和 普通参数 一起使用的时候需要注意的地方
注意:函数参数有默认值的参数需要在没有默认值的参数的最右边定义
3、函数默认参数的总结
1、默认参数是在函数的声明确定的,不能在定义的时候设置
(C++语言设计时考虑到了与C语言的兼容性和可维护性。
C语言没有默认参数,C++引入默认参数时,”
遵循了函数声明即接口的原则“,这样能够明确区分声明和定义的职责)
2、如果默认参数是赋值变量,赋值的变量是全局变量并且要在函数声明之前(作用域要满足函数参数赋值)
3、设置默认值要从函数参数列表的最右边设置,基于参数列表中有普通参数的情况下。
4、函数重载和默认参数结合,注意二义性!
三、占位参数
1、概念:
在“”“函数定义时“”“”,形参只写类型,不写形参变量名
2、基本语法
返回值类型 函数名(type ) //type --- int char{ }
作用:
① 函数接口一致性:在某些情况下,为了与其他函数保持一致的接口,
需要在函数声明和定义中提供参数列表,而实际上函数体内并不需要使用这些参数。
这时可以使用占位参数来达到接口一致的目的。
② 避免警告:在一些情况下,编译器可能会发出警告,指出函数声明和定义中的参数未被使用。使用占位参数可以避免这些警告,因为编译器知道这些参数是有意未被使用的。
③ 未来扩展性:有时候在函数初始设计时可能并不需要使用所有的参数,但为了在未来的扩展中保持灵活性,可以先留下一些占位参数的位置,以便日后扩展功能时不需要修改函数接口。
占位参数的例子:
#include <iostream>
using namespace std;
//占位参数的例子
void Fun(int)
{
cout<<"占位操作0"<<endl;
}
void Fun1(char)
{
cout<<"占位操作1"<<endl;
}
void Fun1(int a, char * = "/dev/input/event")
{
cout<<"占位操作2"<<endl;
}
int main()
{
int a = 10;
Fun(12);
Fun1('B');
Fun1(a);
return 0;
}
四、函数的重载与函数占位参数、函数默认参数 ---- 小知识补充
1、下面是函数重载和默认参数,占位参数的混淆
解决方法:
2、函数的重载与函数默认参数的结合,很容易误导你,让你觉得函数重载了
当函数重载 和 默认参数 以及 占位参数结合:
1:重载 默认
2:重载 默认 占位
都有可能出现 二义性的情况,我们要避免!