C++基础知识介绍2(函数重载)

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)函数重载的好处

函数重载使得函数名可以重复,就可以定义出一群功能类似的适用于不同场景的函数,减少了函数名的多样,降低了操作性和提高了效率,如整形的加法和浮点型的加法,同一功能同一名字传不同值就能实现功能,程序中往往有许多函数,不需要程序员去记那么多的函数名,同一函数名就能实现不同功能。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值