1.函数重载
(1)函数重载的概念
函数重载是指在C++中,同一作用域下有多个函数功能不同的同名函数,这种情况称为函数重载,这些同名函数形参列表必须不同,如参数个数不同,类型不同和顺序不同等。
(2)函数重载的规则
- 函数名必须相同
- 形参列表必须不同(如形参个数不同、类型不同和排序顺序不同等)
- 函数的返回值可以相同也可以不同
- 只有返回值不同不足以为函数重载
(3)常见的几种重载
A.函数名相同下,形参个数不同
#include<iostream> using namespace std; int test2(int a,int b) { return a + b; } int tect2(int a,int b,int c)//同名,参数个数不同 { return a + b + c; } int main() { cout << test2(1, 2) << endl; cout << tect2(1, 2, 3) << endl;//计算不同个数相加 return 0; }
B.函数名相同下,形参类型不同
#include<iostream> using namespace std; void test1(int a) { cout << "输入的是整形变量" << endl; } void tect1(char a) { cout << "输入的是字符变量" << endl; } int main() { test1(1);//输入的是整形变量调用形参是整形的函数 test1('a');//输入的是字符变量调用形参是字符的函数 //判断输入的类型 return 0; }
C.函数名相同下,形参顺序不同
void tect3(int a,char b,doule c){......} void tect3(int a,doule c,char b){......}
这里没啥好例子就不举例子了,此时构成函数重载
D.大杂烩,形参个数、类型和顺序至少有一个不同
XXXXXX不举例了,没想到好的XXXXXXXXXXXXXXX
下面看几个有强度的同名函数,判断一下是否函数重载
E.形参名相同时
函数名相同下,类型、个数和顺序都相同,但是形参名字不相同
#include<iostream> using namespace std; void test4(int a)//参数什么的都相同,就是参数名字不同,这是a { cout << a+1 << endl; } void test4(int b)//这个是b { cout << b + 2 << endl; } int main() { test4(2); return 0; }//报错了哈哈哈哈
这个程序运行时报错了,说test4函数已经有主体了,test4前已定义,说明仅仅是形参的名字不同,不足以构成函数重载
F.函数名相同下,返回值类型不同,形参神马的的都相同
#include<iostream> using namespace std; int test5(int a)//返回类型为整形 { return a; } float test5(int a)//返回类型为浮点型 { float tmp = (float)a; return tmp; } int main() { test5(2); return 0; }//报错了
这个程序也报错了,“float test5(int)”: 重载函数与“int test5(int)”只是在返回类型上不同,不能构成重载函数,说明仅仅只是返回值类型不足以构成函数重载
G.const或volatile修饰形参时
函数名相同下,形参用const或volatile修饰时是否构成重载,如果是按值传递则不构成,如果是通过地址传递或通过引用时则构成
H.缺省参数时
函数名相同下,参数类型个数类型都相同时,但其中有函数存在缺省参数的情况
如果只有1个函数缺省的情况:
#include<iostream> using namespace std; int test2(int a,int b) { return a + b; } int tect2(int a,int b = 3)//b为缺省参数 { return a + b; } int main() { cout << test2(1, 2) << endl;//调用的是未缺省的函数 cout << tect2(1) << endl;//调用的是缺省的函数 return 0; }//可见是构成函数缺省了
如果含有多个函数缺省的情况:
#include<iostream> using namespace std; int test2(int a,int b) { return a + b; } int tect2(int a,int b = 3)//b为缺省参数,初始值为3 { return a + b; } int tect2(int a, int b = 9)//b为缺省参数,初始值为9 { return a + b; } int main() { cout << test2(1, 2) << endl;//调用的是未缺省的函数 cout << tect2(1) << endl;//调用的是缺省的函数 return 0; }//此时程序在tect(1)时报错了,说明缺省参数的初始值不同不能构成重载
(4)函数重载的实现原理
在之前学习的C语言中,我们知道程序运行需要经过两个环节编译和链接,其中编译又包括预处理(预编译)、编译和汇编三个步骤
- 预处理:宏定义替换、处理#XX的预编译指令、头文件展开、除掉注释等等
- 编译:语法语义的判断和处理等,然后生成汇编指令
- 汇编:将汇编语言翻译成二进制语言
- 链接:将所有的源文件和含有库函数的头文件等头文件链接起来
而C++就是在编译生成汇编语言时,将函数名用一种特殊方法(根据参数的顺序和类型)生成,来达到区分函数名相同但参数不同的函数,而C语言中则是直接将函数名编译成原函数名形成汇编语言,导致不能区分函数名相同的函数
(5)函数重载的好处
函数重载使得函数名可以重复,就可以定义出一群功能类似的适用于不同场景的函数,减少了函数名的多样,降低了操作性和提高了效率,如整形的加法和浮点型的加法,同一功能同一名字传不同值就能实现功能,程序中往往有许多函数,不需要程序员去记那么多的函数名,同一函数名就能实现不同功能。