C++重载函数和运算符
重载概述
有了C++语言,你就可以重载函数和运算符。重载是一种应用,它在同一范围中为一个给定函数名称提供了多种定义。委托编译器依据调用该函数的参量选择合适的函数或运算符的版本。例如:
double max(double d1,double d2)
{
return (d1>d2)?d1:d2;
}
int max (int i1, int i2)
{
return (i1>i2)?i1:i2;
}
作为一个重载函数,函数max在程序中使用如下:
main()
{
int i=max(12,8);
double d=max(32.9,17.4);
return i+(int)d;
}
在第一个例子中,要求出两个整型变量的最大值,故调用函数(int,int)。然而,在第二种情况下,两个参量是浮点型,因此调用的函数是max(double,double)。
参量类型的差异
重载函数之间的区别在于带有不同初始值的参量类型。因而对一个给定类型的参量以及对于该类型的引用,在重载的意义上来说是完全相同的。它们被看成是相同的,因为它们采用了相同的初始值。例如:max(double,double)和(double&,double &)是完全相同的,说明两个这样的函数会引起错误。
出于相同的原因,用修饰符const和volatile进行修饰的函数参量类型同基本类型,在重载的意义上看没有什么不同。
然而重载函数的机制可以区分由const或volatile修饰的引用以及基本类型的引用。这使得可以有下列代码:
#include <iostream.h>
class Over
{
public:
Over() {cout << "Over default constructor/n"}
Over(over &o){cout << "Over &/n";}
Over(const Over &co) {cout << "const Over &/n";}
Over(volatile Over &vo) {cout << "volatile Over &/n";}
};
void main()
{
Over o1; //调用缺省构造函数
Over o2(o1); //调用Over(Over&)
const Over o3;//调用缺省构造函数
Over o4(o3); //调用Over(const Over &)
volatile Over o5; //调用缺省构造函数
Over o6(o5); //调用Over(volatile Over &)
}
指向const和volatile对象的指针和指向其基本类型的指针在重载意义上是不同的。
重载函数的限制
一组重载函数是否是可接受的如下限制:
* 该组重载函数中任何两个都必须有不同的参量表。
* 具有相同类型参量表、仅在返回值类型上不同的重载函数会引起错误。
Microsoft特殊处
用户可以仅仅基于返回类型不同而重载new运算符。尤其在基于说明的存储器模式修饰符不同时。
Microsoft特殊处结束
* 成员函数的重载不能仅基于一个说明为静态的,另一个说明为非静态的。
* typedef说明并未定义新的类型,它们仅为已存在的类型引入了一个同义词。它们不能影响重载机制。考虑下面的代码:
typedef char * PSTR;
void Print(char * szToPrint);
void Print(PSTR szToPrint);
前面的两个函数有相同的参量表,PSTR是类型char *的同义词。在成员范围中, 这样的代码会产生错误。
* 枚举类型是一些可区分的类型,故可以区分重载函数。
* 从区分重载函数的意义上说,类型“数组”和“指针”是相同的。对于一维数组来说是正确的。因而下面的重载函数出现了冲突,并会产生一条错误消息:
void Print (char * szToPrint);
void Print (char szToPrint[]);
对于多维数组,第二和后续维数视为类型的一部分,因此它们可以用来区分重载函数:
void Print (char szToPrint []);
void Print (char szToPrint [][7]);
void Print (char szToPrint [][9][42]);