回首谭浩强《C++程序设计》,开篇就来讲讲重载。
首先,函数重载。
特点如下:
①重载函数的函数名相同。如求最大值的函数,int max(int a,int b)和double max(double a,double b)。
②声明时形参的个数或类型或顺序必须至少有一项不同。
③特别需要注意的是函数类型不能作为函数重载的一种标志。也即是,如果函数名相同、形参个数以及类型都对应相同,只有函数类型不同,
这样的函数重载是错误的。因为编译系统无法知道调用哪个。
看到这,你是否有这样的疑问:仅仅函数名不同,函数重载有何意义?应该说对于小型程序而言,重载和不重载区别并不是很大。但是,我们
试想下:如果程序规模很大,这是又会如何呢?就拿前面的求最大值的函数来说,具体程序中可能要是要整数求最大值,单精度数求最大值,
双精度数求最大值等等,如果都是不同的名字,那么我们就得时刻注意我们要调用哪个函数,容易出错。同名之后,这一问题就解决了。
其次,运算符重载。
⑴为什么要有运算符重载?
C++提供的运算符只是完成了标准数据类型的种种运算,比如加减乘除。但C++是面向对象,实际编程过程中必然会涉及到建立新类型。
而这些新类型是无法直接运用C++提供的运算符的。需要重载。
⑵重载的方法?
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。所以,可以
说:运算符重载的实质还是函数重载。
⑶运算符重载要注意哪些方面?
①只允许重载已存在的运算符。用户不能自己创造运算符。
②重载不能改变运算符运算对象的个数。
③重载不能改变运算符的优先级。
④重载不能改变运算符的结合性。
⑤重载运算符的函数不能有默认的参数。
⑥重载的运算符必须和由用户定义的自定义类型的对象一起使用,其参数至少有一个是类对象或类对象的引用。
⑦用于类对象的运算符一般必须重载,但也有例外,运算符“=”和“&”不必用户定义。
⑧应该使重载运算符的功能类似于该运算符作用于标准数据类型时所体现的功能。
⑨运算符重载函数可以是类的成员函数,也可以是类的友元函数,也可以仅仅只是普通函数。
最后,介绍了前面的一些基础理论后,我用一个小程序来实现相应的功能。
该程序是用来是实现复数与复数相加以及复数与双精度数相加的。其中有对“+”的重载函数,同时也体现了函数的重载。
具体见程序注释部分。
代码如下:(VC6.0下调试正确)
#include<iostream.h>
class Complex //复数类
{
public:
Complex();
Complex(double a,double b);
/*对“+”的重载*/
Complex operator+(Complex &a);
/*对“+”的重载,以及函数重载*/
friend Complex operator+(double &a,Complex &b);
friend Complex operator+(Complex &a,double &b);
void display();
private:
double real;
double image;
};
Complex::Complex()
{
real=0;
image=0;
}
Complex::Complex(double a,double b)
{
real=a;
image=b;
}
Complex Complex::operator+(Complex &a)
{
Complex c;
c.real=real+a.real;
c.image=image+a.image;
return c;
}
Complex operator+(double &a,Complex &b)
{
return Complex(a+b.real,b.image);
}
Complex operator+(Complex &a,double &b)
{
return Complex(a.real+b,a.image);
}
void Complex::display()
{
cout<<"("<<real<<","<<image<<"i)"<<endl;
}
int main()
{
Complex c1(2,-1),c2(5,9),c3,c4,c5;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
c3=c1+c2; //复数相加
cout<<"c3=";c3.display();
double a;
cin>>a;
c4=a+c1; //双精度数加复数
cout<<"c4=";c4.display();
c5=c2+a; //复数加双精度数
cout<<"c5=";c5.display();
return 0;
}
测试结果:
写在最后:笔者能力有限,如有错漏之处,还请不吝赐教!