运算符重载类似函数重载是为已有的运算符定义新的运算功能,体现了多态性。
举个例子
“+”的基本功能是实现整数相加和实数相加
通过运算符重载我们可以对他的功能进行扩充,我们之前用的string类中就是如此
string a=“123’,b=“456”,c;
则 c=a+b;
c就为"123456”
这里"+"被重载为两个字符串拼接
实现运算符重载功能的函数称为于是暖夫重载函数,格式为
返回类型 operator 运算符符号(参数说明);
举例子
//定义一个复数类
class Complex
{
private:
double real,image;
public:
Complex(double r=0,double i=0){real=r;image=i;}
Complex operator+(const Complex &c){
Complex temp;
temp.real=real+c.real;
temp.image=image+c.image;
return temp;
}
};
这样我们就可以
Complex a(1,2),b(3,4),c;
c=a+b;//隐式调用a.operator+(b)
//c的real为4,image为6
//定义一个复数类
class Complex
{
private:
double real,image;
public:
Complex(double r=0,double i=0){real=r;image=i;}
friend Complex operator+(const Complex &a,const Complex &b);
};
Complex Complex::operator+(const Complex &a,const Complex &b)
{
Complex temp;
temp.real=a.real+b.real;
temp.image=a.image+b.image;
return temp;
}
这样我们就可以
Complex a(1,2),b(3,4),c;
c=a+b;//隐式调用operator+(a,b)
//c的real为4,image为6
四种类型转换
内部类型的转换我们用过很多次,强制转换和自动转换,这里不说了
内部类型转为用户自定义类型要用转换构造函数
比如前面的Complex类
我可以添加一个
Complex(double c){real=c;image=0;}
实现把一个double类型转换成Complex类型
类类型转换为内部基本数据类型或者其他类类型要用类型转换成员函数
operator type()
{
···
return data;//data的类型是type,可以是内部也可以是自定义
}
这个函数可以将本类的类型转换为其他类型
例如还是那个Complex类
我定义
operator double()
{
return real;
}
这样可以把一个Complex类转换成double类
这里重点举例>>和<<的运算符重载
注意由于无法更改ostream和istream类定义,所以这两个运算符重载函数只能定义成两个参数的全局函数,应且必须在用户自定义的类中声明为友元函数
friend ostream & operator<<(ostream &out, 类对象 &r);
friend istream & operator>>(istream &in, 类对象 &r);