函数重载
在C语言中,函数名代表函数地址,不同的函数必须有不同的函数名,即使是参数表不同但功能相同的函数,这显然与高级程序设计的简约原则不符合。所以在C++中,功能相同的函数可以拥有同样的函数名,这就称之为函数重载。
函数重载要求函数的参数表不同,即参数类型或者形参个数不同。如:
void Selection(int *pa, int n);
void Selection(double *pa, int n);
可是这些重载的函数如何对应不同的地址呢?C++的方法是是建立一个映射,是函数名和形参表映射到一个新的函数名,这个映射是单一的。两个函数只要形参表有一处不同,对应的新的函数名就不同,让这个新的函数名对应地址。这项工作由C++编译器完成:根据函数名和形参表对函数名进行扩展,形成函数的内部名字,这个内部名称就对应函数地址。
当然,不同的编译器扩展函数名的方法可能不同,但实质相同。
运算符的重载。
系统为标准类型数据提供了很多运算度进行相关运算,用户可以直接使用。但是对于一些用户自己定义的类型,则不能直接使用运算符。因此C++引入了运算符重载。运算符重载的思路是:把运算符等价的看作函数,然后通过对该函数的重载,扩大运算符的操作对象,这样的函数称为运算符函数。
运算符函数名一般为 operator@,@为一种运算符。如operator==.
如果希望能够判断两个Student类型的变量,则重载运算符函数operator==:
int operator== (Student a, Student b)
{
return (a.grades == b.grades);
}
重载之后,运算符==就增加了结构Student变量。具体执行过程是:编译器如果发现内部无法解释的运算,就会去寻找运算符重载函数,找到之后调用这个函数。所以说,运算符重载就是函数的另一种调用形式。但是,运算符函数的调用并不适用标准类型的数据,如不能把 5 == 6 解释称operator==(5,6)。
运算符重载还有几个问题要说明:
1、不能重载的运算符:成员运算符“.”,域解析符"::",成员指针运算符“.*”,条件运算符“ ? :”
2、不能改变运算符的优先级;不能创建运算符。
3、运算符重载函数至少有一个形参是用户定义类型。