函数重载就是对一个已有的函数赋予新的含义,使之实现新的功能。因此,同一个函数名就可以用来代表不同功能的函数,就是一名多用。
运算符也可以重载。实际上,我们已经不知不觉的使用过运算符重载。例如,对加法运算符“+”对整数、单精度和双精度进行加法运算;“<<”是C++的位运算中的位移运算符(左移),但在输出操作中又与流对象cout配合使用的流插入运算符,同样,“>>”是位移运算符(右移),但在输入操作中又是与cin配合使用的流提取运算符。
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数。运算符重载实质上是函数地重载。
重载运算符的函数一般格式如下:
函数类型 operator 运算符名称(形参列表)
{对运算符的重载处理}
例如,想将“+”用于Complex类(复数)的加法运算,函数地原型可以这样:
Complex operator+(Complex &c1,Complex &c2);
operator是关键字,函数名是由operator和运算符组成,上面的operator+就是函数名,表示对运算符“+”进行重载,只要掌握这一点,就可以发现这类函数和普通函数并没有什么区别。
通过以下程序说明:
例1.运算符重载函数作为类成员函数
#include <iostream>
using namespace std;
class Complex
{
public:
Complex(){real=0;image=0;}
Complex(double r,double i){real=r;image=i;}
//Complex complex_add(Complex &c2);//普通的类函数声明
Complex operator+(Complex &c2); //运算符重载函数声明
void display();
private:
double real;
double image;
};
//Complex Complex::complex_add(Complex &c2) //普通的类函数
Complex Complex::operator+ (Complex &c2) //运算符重载
{
Complex c;
c.real=real+c2.real; //c.real=this->real+c2.real;
c.image=image+c2.image; //c.image=this->image+c2.image;
return c;
}
void Complex::display()
{
cout<<"("<<real<<","<<image<<"i)"<<endl;
}
int main()
{
Complex c1(3,4),c2(5,-10),c3;
// c3=c1.complex_add(c2); //不同之处三
c3=c1+c2;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
cout<<"c1+c2=";c3.display();
return 0;
}
重载运算符的规则:
1.C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。
2.重载不能改变运算符运算对象的个数
3.重载不能改变运算符的优先级别
4.重载不能改变运算符的结合性
5.重载运算符不能有默认的参数
6.重载运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个是类对象(或类对象的引用)。这样可以防止用户修改用于标准类型数据的运算符性质。
7.用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。
8.应当使重载运算符的功能类似于该运算符作用于标准类型数据时实现的功能。
9.运算符的重载可以是类成员函数,也可以是类得友元函数,还可以是其他的普通函数。
例2.运算符重载函数作为友元函数
#include <iostream>
using namespace std;
class Complex
{
public:
Complex(){real=0;image=0;}
Complex(double r,double i){real=r;image=i;}
//Complex complex_add(Complex &c2); //普通的类函数声明
//Complex operator+(Complex &c2); //运算符重载函数声明
friend Complex operator+(Complex &c1,Complex &c2); //运算符重载函数作为友元函数
void display();
private:
double real;
double image;
};
//Complex Complex::complex_add(Complex &c2) //普通的类函数
//Complex Complex::operator+ (Complex &c2) //运算符重载
Complex operator+(Complex &c1,Complex &c2) //定义作为友元函数地重载函数
{
Complex c;
c.real=c1.real+c2.real; //c.real=this->real+c2.real;
c.image=c1.image+c2.image; //c.image=this->image+c2.image;
return c;
}
void Complex::display()
{
cout<<"("<<real<<","<<image<<"i)"<<endl;
}
int main()
{
Complex c1(3,4),c2(5,-10),c3;
// c3=c1.complex_add(c2); //不同之处三
c3=c1+c2;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
cout<<"c1+c2=";c3.display();
return 0;
}