函数的重载
关于函数的重载,谭浩强的《C++程序设计》中是这样描述的。
在编程时,一般是一个函数对应一种功能。但有时我们要实现的是同一类的功能,只是有些细节不同。例如希望从3个数中找出其中的最大者,而每次求最大数时数据的类型不同,可能是3个整数、3个双精度数或3个长整型数。程序设计者往往会分别设计出3个不同的函数,其函数原型为:
int max1(int a,int b, int c); //求3个整数中的最大者
double max2(double a,double b,double c); //求3个双精度数中的最大者
long max3(long a,long b,long c); //求3个长整数中的最大者
从上述3个函数中不难看出它们的函数体是相同的。然而对程序编写者来说,分别编写出功能相同而名字不同的函数,这是很不方便的。有人自然会想:能否不用3个函数名而用一个统一的函数名呢?
这样函数重载的概念也就出来了,C++中允许用同一作用域中声明几个功能类似的同名函数,这些同名函数的参数个数、参数类型、参数顺序不同。这就是函数的重载,即对一个函数名重新赋予它新的含义,是一个函数名可以多用。所谓重载,其实就是“一物多用”。
下面我们来看看相关例子:求3个数中最大的数(分别考虑,整数、双精度数、长整数3种情况)
#include<iostream>
using namespace std;
int max(int a,int b,int c)
{
if (b > a)
a = b;
if (c > a)
a = c;
return a;
}
double max(double a, double b, double c)
{
if (b > a)
a = b;
if (c > a)
a = c;
return a;
}
long max(long a, long b, long c)
{
if (b > a)
a = b;
if (c > a)
a = c;
return a;
}
int main()
{
int i, i1, i2, i3;
cin >> i1 >> i2 >> i3;
i = max(i1, i2, i3);
cout << "int_max = " << i << endl;
double d, d1, d2, d3;
cin >> d1 >> d2 >> d3;
d = max(d1, d2, d3);
cout << "double_max = " << d << endl;
long g, g1, g2, g3;
cin >> g1 >> g2 >> g3;
g = max(g1, g2, g3);
cout << "long_max = " << g << endl;
return 0;
}
运行结果图:
从结果中可以看出系统会根据调用函数时给出的信息去找与之匹配的函数。这里只测试了函数参数类型不同,参数个数不同,参数顺序不同也能够形成重载,这里就不一一测试了。
函数重载中需要注意的事
(一)当两个函数只有返回值类型不同,而函数的参数类型、个数、顺序完全相同时,不能形成重载
首先来看看下面这段代码:
#include<iostream>
using namespace std;
void test(int a)
{
cout << a << endl;
}
int test(int a)
{
a += a;
cout << a << endl;
return a;
}
int main()
{
test();
return 0;
}
上述代码执行结果:
(二)全缺省参数函数与重载函数不要同时使用
看看下述代码和执行结果:
#include<iostream>
using namespace std;
void FunTest(int a = 10)
{
cout <<"void FunTest(int a = 10) "<< endl;
}
void FunTest(int a )
{
cout << "void FunTest(int a) " << endl;
}
int main()
{
FunTest(10);
return 0;
}
代码执行结果:
引用
在了解引用之前,我们先了解一下在c语言中函数的两种传参方式:一是传值,二是传址。
(一)传值
传值,就是在函数调用过程中会产生一份临时变量,最终把实参的值传递给新分配的临时变量,即形参。
优点:函数所产生的副作用不会影响到外部实参
缺点:对函数的修改不会影响到外部实参,即无法改变形参的值
(二)传址
传址,即通过指针传递,也就是通过形参改变实参的值,也就是通过形参带出函数所需要的结果。
优点:对形参的修改一定会影响到外部实参
缺点:a.指针用起来不安全
b.函数所产生的副作用会影响到外部实参
c.“ * ”键失灵的时候会造成很多麻烦
综合上述两种函数传参方法,有人自然就会想,能不能像值一样传递,同时又能达到指针的效果的传参方式呢?C++对C做的一个重要扩充就是对一个数据可以使用“引用”。
(三)引用
引用是一种新的变量类型,它的作用是为一个变量起一个别名,并不需要另外开辟空间来存放改变量类型的值。假如有一个变量a,想给它起一个别名b,可以这样写:
int a; //定义a是整形变量
int& b = a; //声明b是a的引用
优点:引用结合了值传递和址传递的优点,更加简单、方便、直观。
注:上述代码中的“ & ”是引用声明符,并不代表地址。声明b是a的引用,即b是a的别名。
关于引用的使用场景,给变量起别名、将引用作为函数的形参、将引用作为函数的返回值以及引用与指针的比较,且听下回分解。